I: pbuilder: network access will be disabled during build I: Current time: Fri May 22 16:33:43 -12 2026 I: pbuilder-time-stamp: 1779510823 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/trixie-reproducible-base.tgz] I: copying local configuration W: --override-config is not set; not updating apt.conf Read the manpage for details. I: mounting /proc filesystem I: mounting /sys filesystem I: creating /{dev,run}/shm I: mounting /dev/pts filesystem I: redirecting /dev/ptmx to /dev/pts/ptmx I: policy-rc.d already exists I: Copying source file I: copying [crystal_1.14.0+dfsg-1.dsc] I: copying [./crystal_1.14.0+dfsg.orig.tar.xz] I: copying [./crystal_1.14.0+dfsg-1.debian.tar.xz] I: Extracting source dpkg-source: warning: cannot verify inline signature for ./crystal_1.14.0+dfsg-1.dsc: unsupported subcommand dpkg-source: info: extracting crystal in crystal-1.14.0+dfsg dpkg-source: info: unpacking crystal_1.14.0+dfsg.orig.tar.xz dpkg-source: info: unpacking crystal_1.14.0+dfsg-1.debian.tar.xz dpkg-source: info: using patch list from debian/patches/series dpkg-source: info: applying disable-udp-multicast-specs.diff dpkg-source: info: applying remove-check-in-random-failing-test.diff 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/409873/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=42 ' DISTRIBUTION='trixie' HOME='/root' HOST_ARCH='amd64' IFS=' ' INVOCATION_ID='a0c42fcdae044edf8617e7d11b60dbb2' 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='409873' PS1='# ' PS2='> ' 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.SzLLGw1D/pbuilderrc_qPQy --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.SzLLGw1D/b1 --logfile b1/build.log crystal_1.14.0+dfsg-1.dsc' SUDO_GID='110' SUDO_UID='105' SUDO_USER='jenkins' TERM='unknown' TZ='/usr/share/zoneinfo/Etc/GMT+12' USER='root' _='/usr/bin/systemd-run' http_proxy='http://213.165.73.152:3128' I: uname -a Linux ionos5-amd64 6.12.12+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.12-1~bpo12+1 (2025-02-23) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Mar 4 2025 /bin -> usr/bin I: user script /srv/workspace/pbuilder/409873/tmp/hooks/D02_print_environment finished -> Attempting to satisfy build-dependencies -> Creating pbuilder-satisfydepends-dummy package Package: pbuilder-satisfydepends-dummy Version: 0.invalid.0 Architecture: amd64 Maintainer: Debian Pbuilder Team Description: Dummy package to satisfy dependencies with aptitude - created by pbuilder This package was created automatically by pbuilder to satisfy the build-dependencies of the package being currently built. Depends: debhelper-compat (= 13), git, libbsd-dev, libedit-dev, libevent-dev, libgc-dev (>= 1:7.6.0), libgmp-dev, libpcre2-dev, libssl-dev, libtool, libxml2-dev, libyaml-dev, libz-dev, lld-19, llvm-19-dev, pkgconf, crystal (>= 1.6.0) dpkg-deb: building package 'pbuilder-satisfydepends-dummy' in '/tmp/satisfydepends-aptitude/pbuilder-satisfydepends-dummy.deb'. Selecting previously unselected package pbuilder-satisfydepends-dummy. (Reading database ... 19840 files and directories currently installed.) Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ... Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ... dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested: pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however: Package debhelper-compat is not installed. pbuilder-satisfydepends-dummy depends on git; however: Package git is not installed. pbuilder-satisfydepends-dummy depends on libbsd-dev; however: Package libbsd-dev is not installed. pbuilder-satisfydepends-dummy depends on libedit-dev; however: Package libedit-dev is not installed. pbuilder-satisfydepends-dummy depends on libevent-dev; however: Package libevent-dev is not installed. pbuilder-satisfydepends-dummy depends on libgc-dev (>= 1:7.6.0); however: Package libgc-dev is not installed. pbuilder-satisfydepends-dummy depends on libgmp-dev; however: Package libgmp-dev is not installed. pbuilder-satisfydepends-dummy depends on libpcre2-dev; however: Package libpcre2-dev is not installed. pbuilder-satisfydepends-dummy depends on libssl-dev; however: Package libssl-dev is not installed. pbuilder-satisfydepends-dummy depends on libtool; however: Package libtool is not installed. pbuilder-satisfydepends-dummy depends on libxml2-dev; however: Package libxml2-dev is not installed. pbuilder-satisfydepends-dummy depends on libyaml-dev; however: Package libyaml-dev is not installed. pbuilder-satisfydepends-dummy depends on libz-dev; however: Package libz-dev is not installed. pbuilder-satisfydepends-dummy depends on lld-19; however: Package lld-19 is not installed. pbuilder-satisfydepends-dummy depends on llvm-19-dev; however: Package llvm-19-dev is not installed. pbuilder-satisfydepends-dummy depends on pkgconf; however: Package pkgconf is not installed. pbuilder-satisfydepends-dummy depends on crystal (>= 1.6.0); however: Package crystal is not installed. Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ... Reading package lists... Building dependency tree... Reading state information... Initializing package states... Writing extended state information... Building tag database... pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) The following NEW packages will be installed: autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} crystal{a} debhelper{a} dh-autoreconf{a} dh-strip-nondeterminism{a} dwz{a} file{a} gettext{a} gettext-base{a} git{a} git-man{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libbrotli1{a} libbsd-dev{a} libclang-cpp19{a} libcom-err2{a} libcurl3t64-gnutls{a} libcurl4t64{a} libdebhelper-perl{a} libedit-dev{a} libedit2{a} libelf1t64{a} liberror-perl{a} libevent-2.1-7t64{a} libevent-core-2.1-7t64{a} libevent-dev{a} libevent-extra-2.1-7t64{a} libevent-openssl-2.1-7t64{a} libevent-pthreads-2.1-7t64{a} libexpat1{a} libffi-dev{a} libffi8{a} libfile-stripnondeterminism-perl{a} libgc-dev{a} libgc1{a} libgmp-dev{a} libgmpxx4ldbl{a} libgnutls30t64{a} libgssapi-krb5-2{a} libidn2-0{a} libjs-codemirror{a} libjs-jquery{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libldap2{a} libllvm19{a} libmagic-mgc{a} libmagic1t64{a} libmd-dev{a} libncurses-dev{a} libncurses6{a} libnghttp2-14{a} libnghttp3-9{a} libngtcp2-16{a} libngtcp2-crypto-gnutls8{a} libp11-kit0{a} libpcre2-16-0{a} libpcre2-32-0{a} libpcre2-dev{a} libpcre2-posix3{a} libpfm4{a} libpipeline1{a} libpkgconf3{a} libpsl5t64{a} libpython3-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} librtmp1{a} libsasl2-2{a} libsasl2-modules-db{a} libssh2-1t64{a} libssl-dev{a} libtasn1-6{a} libtool{a} libuchardet0{a} libunistring5{a} libxml2{a} libxml2-dev{a} libyaml-0-2{a} libyaml-dev{a} libz3-4{a} libz3-dev{a} lld-19{a} llvm-19{a} llvm-19-dev{a} llvm-19-linker-tools{a} llvm-19-runtime{a} llvm-19-tools{a} m4{a} man-db{a} media-types{a} netbase{a} pkgconf{a} pkgconf-bin{a} po-debconf{a} python3{a} python3-minimal{a} python3-pygments{a} python3-yaml{a} python3.13{a} python3.13-minimal{a} readline-common{a} sensible-utils{a} tzdata{a} zlib1g-dev{a} The following packages are RECOMMENDED but will NOT be installed: binfmt-support ca-certificates curl javascript-common krb5-locales less libarchive-cpio-perl libgpm2 libldap-common libltdl-dev libmail-sendmail-perl libsasl2-modules lynx openssh-client publicsuffix systemd wget 0 packages upgraded, 114 newly installed, 0 to remove and 0 not upgraded. Need to get 161 MB of archives. After unpacking 882 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian trixie/main amd64 libpython3.13-minimal amd64 3.13.2-3 [861 kB] Get: 2 http://deb.debian.org/debian trixie/main amd64 libexpat1 amd64 2.7.1-1 [108 kB] Get: 3 http://deb.debian.org/debian trixie/main amd64 python3.13-minimal amd64 3.13.2-3 [2212 kB] Get: 4 http://deb.debian.org/debian trixie/main amd64 python3-minimal amd64 3.13.2-2 [27.1 kB] Get: 5 http://deb.debian.org/debian trixie/main amd64 media-types all 13.0.0 [29.3 kB] Get: 6 http://deb.debian.org/debian trixie/main amd64 netbase all 6.5 [12.4 kB] Get: 7 http://deb.debian.org/debian trixie/main amd64 tzdata all 2025b-2 [260 kB] Get: 8 http://deb.debian.org/debian trixie/main amd64 libffi8 amd64 3.4.7-1 [23.9 kB] Get: 9 http://deb.debian.org/debian trixie/main amd64 readline-common all 8.2-6 [69.4 kB] Get: 10 http://deb.debian.org/debian trixie/main amd64 libreadline8t64 amd64 8.2-6 [169 kB] Get: 11 http://deb.debian.org/debian trixie/main amd64 libpython3.13-stdlib amd64 3.13.2-3 [1952 kB] Get: 12 http://deb.debian.org/debian trixie/main amd64 python3.13 amd64 3.13.2-3 [746 kB] Get: 13 http://deb.debian.org/debian trixie/main amd64 libpython3-stdlib amd64 3.13.2-2 [10.1 kB] Get: 14 http://deb.debian.org/debian trixie/main amd64 python3 amd64 3.13.2-2 [28.1 kB] Get: 15 http://deb.debian.org/debian trixie/main amd64 sensible-utils all 0.0.24 [24.8 kB] Get: 16 http://deb.debian.org/debian trixie/main amd64 libmagic-mgc amd64 1:5.45-3+b1 [314 kB] Get: 17 http://deb.debian.org/debian trixie/main amd64 libmagic1t64 amd64 1:5.45-3+b1 [108 kB] Get: 18 http://deb.debian.org/debian trixie/main amd64 file amd64 1:5.45-3+b1 [43.3 kB] Get: 19 http://deb.debian.org/debian trixie/main amd64 gettext-base amd64 0.23.1-1 [243 kB] Get: 20 http://deb.debian.org/debian trixie/main amd64 libuchardet0 amd64 0.0.8-1+b2 [68.9 kB] Get: 21 http://deb.debian.org/debian trixie/main amd64 groff-base amd64 1.23.0-7 [1185 kB] Get: 22 http://deb.debian.org/debian trixie/main amd64 bsdextrautils amd64 2.41-4 [94.6 kB] Get: 23 http://deb.debian.org/debian trixie/main amd64 libpipeline1 amd64 1.5.8-1 [42.0 kB] Get: 24 http://deb.debian.org/debian trixie/main amd64 man-db amd64 2.13.0-1 [1420 kB] Get: 25 http://deb.debian.org/debian trixie/main amd64 m4 amd64 1.4.19-7 [294 kB] Get: 26 http://deb.debian.org/debian trixie/main amd64 autoconf all 2.72-3 [493 kB] Get: 27 http://deb.debian.org/debian trixie/main amd64 autotools-dev all 20240727.1 [60.2 kB] Get: 28 http://deb.debian.org/debian trixie/main amd64 automake all 1:1.17-4 [862 kB] Get: 29 http://deb.debian.org/debian trixie/main amd64 autopoint all 0.23.1-1 [770 kB] Get: 30 http://deb.debian.org/debian trixie/main amd64 libevent-2.1-7t64 amd64 2.1.12-stable-10+b1 [182 kB] Get: 31 http://deb.debian.org/debian trixie/main amd64 libgc1 amd64 1:8.2.8-1 [247 kB] Get: 32 http://deb.debian.org/debian trixie/main amd64 libedit2 amd64 3.1-20250104-1 [93.8 kB] Get: 33 http://deb.debian.org/debian trixie/main amd64 libxml2 amd64 2.12.7+dfsg+really2.9.14-0.4 [698 kB] Get: 34 http://deb.debian.org/debian trixie/main amd64 libz3-4 amd64 4.13.3-1 [8560 kB] Get: 35 http://deb.debian.org/debian trixie/main amd64 libllvm19 amd64 1:19.1.7-3 [26.0 MB] Get: 36 http://deb.debian.org/debian trixie/main amd64 libgc-dev amd64 1:8.2.8-1 [416 kB] Get: 37 http://deb.debian.org/debian trixie/main amd64 libpkgconf3 amd64 1.8.1-4 [36.4 kB] Get: 38 http://deb.debian.org/debian trixie/main amd64 pkgconf-bin amd64 1.8.1-4 [30.2 kB] Get: 39 http://deb.debian.org/debian trixie/main amd64 pkgconf amd64 1.8.1-4 [26.2 kB] Get: 40 http://deb.debian.org/debian trixie/main amd64 libpcre2-16-0 amd64 10.45-1 [281 kB] Get: 41 http://deb.debian.org/debian trixie/main amd64 libpcre2-32-0 amd64 10.45-1 [268 kB] Get: 42 http://deb.debian.org/debian trixie/main amd64 libpcre2-posix3 amd64 10.45-1 [63.5 kB] Get: 43 http://deb.debian.org/debian trixie/main amd64 libpcre2-dev amd64 10.45-1 [853 kB] Get: 44 http://deb.debian.org/debian trixie/main amd64 libevent-core-2.1-7t64 amd64 2.1.12-stable-10+b1 [132 kB] Get: 45 http://deb.debian.org/debian trixie/main amd64 libevent-extra-2.1-7t64 amd64 2.1.12-stable-10+b1 [108 kB] Get: 46 http://deb.debian.org/debian trixie/main amd64 libevent-pthreads-2.1-7t64 amd64 2.1.12-stable-10+b1 [54.3 kB] Get: 47 http://deb.debian.org/debian trixie/main amd64 libevent-openssl-2.1-7t64 amd64 2.1.12-stable-10+b1 [61.1 kB] Get: 48 http://deb.debian.org/debian trixie/main amd64 libevent-dev amd64 2.1.12-stable-10+b1 [305 kB] Get: 49 http://deb.debian.org/debian trixie/main amd64 libjs-codemirror all 5.65.0+~cs5.83.9-3 [774 kB] Get: 50 http://deb.debian.org/debian trixie/main amd64 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB] Get: 51 http://deb.debian.org/debian trixie/main amd64 crystal amd64 1.14.0+dfsg-1 [4375 kB] Get: 52 http://deb.debian.org/debian trixie/main amd64 libdebhelper-perl all 13.24.2 [90.9 kB] Get: 53 http://deb.debian.org/debian trixie/main amd64 libtool all 2.5.4-4 [539 kB] Get: 54 http://deb.debian.org/debian trixie/main amd64 dh-autoreconf all 20 [17.1 kB] Get: 55 http://deb.debian.org/debian trixie/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get: 56 http://deb.debian.org/debian trixie/main amd64 libfile-stripnondeterminism-perl all 1.14.1-2 [19.7 kB] Get: 57 http://deb.debian.org/debian trixie/main amd64 dh-strip-nondeterminism all 1.14.1-2 [8620 B] Get: 58 http://deb.debian.org/debian trixie/main amd64 libelf1t64 amd64 0.192-4 [189 kB] Get: 59 http://deb.debian.org/debian trixie/main amd64 dwz amd64 0.15-1+b1 [110 kB] Get: 60 http://deb.debian.org/debian trixie/main amd64 libunistring5 amd64 1.3-2 [477 kB] Get: 61 http://deb.debian.org/debian trixie/main amd64 gettext amd64 0.23.1-1 [1680 kB] Get: 62 http://deb.debian.org/debian trixie/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 63 http://deb.debian.org/debian trixie/main amd64 po-debconf all 1.0.21+nmu1 [248 kB] Get: 64 http://deb.debian.org/debian trixie/main amd64 debhelper all 13.24.2 [919 kB] Get: 65 http://deb.debian.org/debian trixie/main amd64 libbrotli1 amd64 1.1.0-2+b7 [307 kB] Get: 66 http://deb.debian.org/debian trixie/main amd64 libidn2-0 amd64 2.3.8-2 [109 kB] Get: 67 http://deb.debian.org/debian trixie/main amd64 libp11-kit0 amd64 0.25.5-3 [425 kB] Get: 68 http://deb.debian.org/debian trixie/main amd64 libtasn1-6 amd64 4.20.0-2 [49.9 kB] Get: 69 http://deb.debian.org/debian trixie/main amd64 libgnutls30t64 amd64 3.8.9-2 [1464 kB] Get: 70 http://deb.debian.org/debian trixie/main amd64 libkrb5support0 amd64 1.21.3-5 [33.0 kB] Get: 71 http://deb.debian.org/debian trixie/main amd64 libcom-err2 amd64 1.47.2-1+b1 [24.3 kB] Get: 72 http://deb.debian.org/debian trixie/main amd64 libk5crypto3 amd64 1.21.3-5 [81.5 kB] Get: 73 http://deb.debian.org/debian trixie/main amd64 libkeyutils1 amd64 1.6.3-6 [9456 B] Get: 74 http://deb.debian.org/debian trixie/main amd64 libkrb5-3 amd64 1.21.3-5 [326 kB] Get: 75 http://deb.debian.org/debian trixie/main amd64 libgssapi-krb5-2 amd64 1.21.3-5 [138 kB] Get: 76 http://deb.debian.org/debian trixie/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-9 [19.8 kB] Get: 77 http://deb.debian.org/debian trixie/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-9 [57.5 kB] Get: 78 http://deb.debian.org/debian trixie/main amd64 libldap2 amd64 2.6.9+dfsg-2 [194 kB] Get: 79 http://deb.debian.org/debian trixie/main amd64 libnghttp2-14 amd64 1.64.0-1 [75.5 kB] Get: 80 http://deb.debian.org/debian trixie/main amd64 libnghttp3-9 amd64 1.8.0-1 [67.7 kB] Get: 81 http://deb.debian.org/debian trixie/main amd64 libngtcp2-16 amd64 1.11.0-1 [131 kB] Get: 82 http://deb.debian.org/debian trixie/main amd64 libngtcp2-crypto-gnutls8 amd64 1.11.0-1 [29.3 kB] Get: 83 http://deb.debian.org/debian trixie/main amd64 libpsl5t64 amd64 0.21.2-1.1+b1 [57.2 kB] Get: 84 http://deb.debian.org/debian trixie/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2+b5 [58.8 kB] Get: 85 http://deb.debian.org/debian trixie/main amd64 libssh2-1t64 amd64 1.11.1-1 [245 kB] Get: 86 http://deb.debian.org/debian trixie/main amd64 libcurl3t64-gnutls amd64 8.13.0-1 [374 kB] Get: 87 http://deb.debian.org/debian trixie/main amd64 liberror-perl all 0.17030-1 [26.9 kB] Get: 88 http://deb.debian.org/debian trixie/main amd64 git-man all 1:2.47.2-0.1 [2205 kB] Get: 89 http://deb.debian.org/debian trixie/main amd64 git amd64 1:2.47.2-0.1 [8788 kB] Get: 90 http://deb.debian.org/debian trixie/main amd64 libmd-dev amd64 1.1.0-2+b1 [55.3 kB] Get: 91 http://deb.debian.org/debian trixie/main amd64 libbsd-dev amd64 0.12.2-2 [258 kB] Get: 92 http://deb.debian.org/debian trixie/main amd64 libclang-cpp19 amd64 1:19.1.7-3 [13.2 MB] Get: 93 http://deb.debian.org/debian trixie/main amd64 libcurl4t64 amd64 8.13.0-1 [381 kB] Get: 94 http://deb.debian.org/debian trixie/main amd64 libncurses6 amd64 6.5+20250216-2 [105 kB] Get: 95 http://deb.debian.org/debian trixie/main amd64 libncurses-dev amd64 6.5+20250216-2 [353 kB] Get: 96 http://deb.debian.org/debian trixie/main amd64 libedit-dev amd64 3.1-20250104-1 [115 kB] Get: 97 http://deb.debian.org/debian trixie/main amd64 libffi-dev amd64 3.4.7-1 [60.8 kB] Get: 98 http://deb.debian.org/debian trixie/main amd64 libgmpxx4ldbl amd64 2:6.3.0+dfsg-3 [329 kB] Get: 99 http://deb.debian.org/debian trixie/main amd64 libgmp-dev amd64 2:6.3.0+dfsg-3 [642 kB] Get: 100 http://deb.debian.org/debian trixie/main amd64 libpfm4 amd64 4.13.0+git99-gc5587f9-1 [371 kB] Get: 101 http://deb.debian.org/debian trixie/main amd64 libssl-dev amd64 3.5.0-1 [2949 kB] Get: 102 http://deb.debian.org/debian trixie/main amd64 libxml2-dev amd64 2.12.7+dfsg+really2.9.14-0.4 [793 kB] Get: 103 http://deb.debian.org/debian trixie/main amd64 libyaml-0-2 amd64 0.2.5-2 [52.5 kB] Get: 104 http://deb.debian.org/debian trixie/main amd64 libyaml-dev amd64 0.2.5-2 [63.4 kB] Get: 105 http://deb.debian.org/debian trixie/main amd64 libz3-dev amd64 4.13.3-1 [107 kB] Get: 106 http://deb.debian.org/debian trixie/main amd64 lld-19 amd64 1:19.1.7-3 [1375 kB] Get: 107 http://deb.debian.org/debian trixie/main amd64 llvm-19-runtime amd64 1:19.1.7-3 [551 kB] Get: 108 http://deb.debian.org/debian trixie/main amd64 llvm-19-linker-tools amd64 1:19.1.7-3 [1260 kB] Get: 109 http://deb.debian.org/debian trixie/main amd64 llvm-19 amd64 1:19.1.7-3 [16.4 MB] Get: 110 http://deb.debian.org/debian trixie/main amd64 python3-pygments all 2.18.0+dfsg-2 [836 kB] Get: 111 http://deb.debian.org/debian trixie/main amd64 python3-yaml amd64 6.0.2-1+b2 [136 kB] Get: 112 http://deb.debian.org/debian trixie/main amd64 llvm-19-tools amd64 1:19.1.7-3 [511 kB] Get: 113 http://deb.debian.org/debian trixie/main amd64 llvm-19-dev amd64 1:19.1.7-3 [43.1 MB] Get: 114 http://deb.debian.org/debian trixie/main amd64 zlib1g-dev amd64 1:1.3.dfsg+really1.3.1-1+b1 [920 kB] Fetched 161 MB in 4s (43.5 MB/s) Preconfiguring packages ... Selecting previously unselected package libpython3.13-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 ... 19840 files and directories currently installed.) Preparing to unpack .../libpython3.13-minimal_3.13.2-3_amd64.deb ... Unpacking libpython3.13-minimal:amd64 (3.13.2-3) ... Selecting previously unselected package libexpat1:amd64. Preparing to unpack .../libexpat1_2.7.1-1_amd64.deb ... Unpacking libexpat1:amd64 (2.7.1-1) ... Selecting previously unselected package python3.13-minimal. Preparing to unpack .../python3.13-minimal_3.13.2-3_amd64.deb ... Unpacking python3.13-minimal (3.13.2-3) ... Setting up libpython3.13-minimal:amd64 (3.13.2-3) ... Setting up libexpat1:amd64 (2.7.1-1) ... Setting up python3.13-minimal (3.13.2-3) ... Selecting previously unselected package python3-minimal. (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 ... 20174 files and directories currently installed.) Preparing to unpack .../0-python3-minimal_3.13.2-2_amd64.deb ... Unpacking python3-minimal (3.13.2-2) ... Selecting previously unselected package media-types. Preparing to unpack .../1-media-types_13.0.0_all.deb ... Unpacking media-types (13.0.0) ... Selecting previously unselected package netbase. Preparing to unpack .../2-netbase_6.5_all.deb ... Unpacking netbase (6.5) ... Selecting previously unselected package tzdata. Preparing to unpack .../3-tzdata_2025b-2_all.deb ... Unpacking tzdata (2025b-2) ... Selecting previously unselected package libffi8:amd64. Preparing to unpack .../4-libffi8_3.4.7-1_amd64.deb ... Unpacking libffi8:amd64 (3.4.7-1) ... Selecting previously unselected package readline-common. Preparing to unpack .../5-readline-common_8.2-6_all.deb ... Unpacking readline-common (8.2-6) ... Selecting previously unselected package libreadline8t64:amd64. Preparing to unpack .../6-libreadline8t64_8.2-6_amd64.deb ... Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8 to /lib/x86_64-linux-gnu/libhistory.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libhistory.so.8.2 to /lib/x86_64-linux-gnu/libhistory.so.8.2.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8 to /lib/x86_64-linux-gnu/libreadline.so.8.usr-is-merged by libreadline8t64' Adding 'diversion of /lib/x86_64-linux-gnu/libreadline.so.8.2 to /lib/x86_64-linux-gnu/libreadline.so.8.2.usr-is-merged by libreadline8t64' Unpacking libreadline8t64:amd64 (8.2-6) ... Selecting previously unselected package libpython3.13-stdlib:amd64. Preparing to unpack .../7-libpython3.13-stdlib_3.13.2-3_amd64.deb ... Unpacking libpython3.13-stdlib:amd64 (3.13.2-3) ... Selecting previously unselected package python3.13. Preparing to unpack .../8-python3.13_3.13.2-3_amd64.deb ... Unpacking python3.13 (3.13.2-3) ... Selecting previously unselected package libpython3-stdlib:amd64. Preparing to unpack .../9-libpython3-stdlib_3.13.2-2_amd64.deb ... Unpacking libpython3-stdlib:amd64 (3.13.2-2) ... Setting up python3-minimal (3.13.2-2) ... Selecting previously unselected package python3. (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 ... 21185 files and directories currently installed.) Preparing to unpack .../000-python3_3.13.2-2_amd64.deb ... Unpacking python3 (3.13.2-2) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../001-sensible-utils_0.0.24_all.deb ... Unpacking sensible-utils (0.0.24) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../002-libmagic-mgc_1%3a5.45-3+b1_amd64.deb ... Unpacking libmagic-mgc (1:5.45-3+b1) ... Selecting previously unselected package libmagic1t64:amd64. Preparing to unpack .../003-libmagic1t64_1%3a5.45-3+b1_amd64.deb ... Unpacking libmagic1t64:amd64 (1:5.45-3+b1) ... Selecting previously unselected package file. Preparing to unpack .../004-file_1%3a5.45-3+b1_amd64.deb ... Unpacking file (1:5.45-3+b1) ... Selecting previously unselected package gettext-base. Preparing to unpack .../005-gettext-base_0.23.1-1_amd64.deb ... Unpacking gettext-base (0.23.1-1) ... Selecting previously unselected package libuchardet0:amd64. Preparing to unpack .../006-libuchardet0_0.0.8-1+b2_amd64.deb ... Unpacking libuchardet0:amd64 (0.0.8-1+b2) ... Selecting previously unselected package groff-base. Preparing to unpack .../007-groff-base_1.23.0-7_amd64.deb ... Unpacking groff-base (1.23.0-7) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../008-bsdextrautils_2.41-4_amd64.deb ... Unpacking bsdextrautils (2.41-4) ... Selecting previously unselected package libpipeline1:amd64. Preparing to unpack .../009-libpipeline1_1.5.8-1_amd64.deb ... Unpacking libpipeline1:amd64 (1.5.8-1) ... Selecting previously unselected package man-db. Preparing to unpack .../010-man-db_2.13.0-1_amd64.deb ... Unpacking man-db (2.13.0-1) ... Selecting previously unselected package m4. Preparing to unpack .../011-m4_1.4.19-7_amd64.deb ... Unpacking m4 (1.4.19-7) ... Selecting previously unselected package autoconf. Preparing to unpack .../012-autoconf_2.72-3_all.deb ... Unpacking autoconf (2.72-3) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../013-autotools-dev_20240727.1_all.deb ... Unpacking autotools-dev (20240727.1) ... Selecting previously unselected package automake. Preparing to unpack .../014-automake_1%3a1.17-4_all.deb ... Unpacking automake (1:1.17-4) ... Selecting previously unselected package autopoint. Preparing to unpack .../015-autopoint_0.23.1-1_all.deb ... Unpacking autopoint (0.23.1-1) ... Selecting previously unselected package libevent-2.1-7t64:amd64. Preparing to unpack .../016-libevent-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libgc1:amd64. Preparing to unpack .../017-libgc1_1%3a8.2.8-1_amd64.deb ... Unpacking libgc1:amd64 (1:8.2.8-1) ... Selecting previously unselected package libedit2:amd64. Preparing to unpack .../018-libedit2_3.1-20250104-1_amd64.deb ... Unpacking libedit2:amd64 (3.1-20250104-1) ... Selecting previously unselected package libxml2:amd64. Preparing to unpack .../019-libxml2_2.12.7+dfsg+really2.9.14-0.4_amd64.deb ... Unpacking libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.4) ... Selecting previously unselected package libz3-4:amd64. Preparing to unpack .../020-libz3-4_4.13.3-1_amd64.deb ... Unpacking libz3-4:amd64 (4.13.3-1) ... Selecting previously unselected package libllvm19:amd64. Preparing to unpack .../021-libllvm19_1%3a19.1.7-3_amd64.deb ... Unpacking libllvm19:amd64 (1:19.1.7-3) ... Selecting previously unselected package libgc-dev:amd64. Preparing to unpack .../022-libgc-dev_1%3a8.2.8-1_amd64.deb ... Unpacking libgc-dev:amd64 (1:8.2.8-1) ... Selecting previously unselected package libpkgconf3:amd64. Preparing to unpack .../023-libpkgconf3_1.8.1-4_amd64.deb ... Unpacking libpkgconf3:amd64 (1.8.1-4) ... Selecting previously unselected package pkgconf-bin. Preparing to unpack .../024-pkgconf-bin_1.8.1-4_amd64.deb ... Unpacking pkgconf-bin (1.8.1-4) ... Selecting previously unselected package pkgconf:amd64. Preparing to unpack .../025-pkgconf_1.8.1-4_amd64.deb ... Unpacking pkgconf:amd64 (1.8.1-4) ... Selecting previously unselected package libpcre2-16-0:amd64. Preparing to unpack .../026-libpcre2-16-0_10.45-1_amd64.deb ... Unpacking libpcre2-16-0:amd64 (10.45-1) ... Selecting previously unselected package libpcre2-32-0:amd64. Preparing to unpack .../027-libpcre2-32-0_10.45-1_amd64.deb ... Unpacking libpcre2-32-0:amd64 (10.45-1) ... Selecting previously unselected package libpcre2-posix3:amd64. Preparing to unpack .../028-libpcre2-posix3_10.45-1_amd64.deb ... Unpacking libpcre2-posix3:amd64 (10.45-1) ... Selecting previously unselected package libpcre2-dev:amd64. Preparing to unpack .../029-libpcre2-dev_10.45-1_amd64.deb ... Unpacking libpcre2-dev:amd64 (10.45-1) ... Selecting previously unselected package libevent-core-2.1-7t64:amd64. Preparing to unpack .../030-libevent-core-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-core-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-extra-2.1-7t64:amd64. Preparing to unpack .../031-libevent-extra-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-extra-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-pthreads-2.1-7t64:amd64. Preparing to unpack .../032-libevent-pthreads-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-pthreads-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-openssl-2.1-7t64:amd64. Preparing to unpack .../033-libevent-openssl-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-openssl-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-dev. Preparing to unpack .../034-libevent-dev_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-dev (2.1.12-stable-10+b1) ... Selecting previously unselected package libjs-codemirror. Preparing to unpack .../035-libjs-codemirror_5.65.0+~cs5.83.9-3_all.deb ... Unpacking libjs-codemirror (5.65.0+~cs5.83.9-3) ... Selecting previously unselected package libjs-jquery. Preparing to unpack .../036-libjs-jquery_3.6.1+dfsg+~3.5.14-1_all.deb ... Unpacking libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Selecting previously unselected package crystal. Preparing to unpack .../037-crystal_1.14.0+dfsg-1_amd64.deb ... Unpacking crystal (1.14.0+dfsg-1) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../038-libdebhelper-perl_13.24.2_all.deb ... Unpacking libdebhelper-perl (13.24.2) ... Selecting previously unselected package libtool. Preparing to unpack .../039-libtool_2.5.4-4_all.deb ... Unpacking libtool (2.5.4-4) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../040-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../041-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../042-libfile-stripnondeterminism-perl_1.14.1-2_all.deb ... Unpacking libfile-stripnondeterminism-perl (1.14.1-2) ... Selecting previously unselected package dh-strip-nondeterminism. Preparing to unpack .../043-dh-strip-nondeterminism_1.14.1-2_all.deb ... Unpacking dh-strip-nondeterminism (1.14.1-2) ... Selecting previously unselected package libelf1t64:amd64. Preparing to unpack .../044-libelf1t64_0.192-4_amd64.deb ... Unpacking libelf1t64:amd64 (0.192-4) ... Selecting previously unselected package dwz. Preparing to unpack .../045-dwz_0.15-1+b1_amd64.deb ... Unpacking dwz (0.15-1+b1) ... Selecting previously unselected package libunistring5:amd64. Preparing to unpack .../046-libunistring5_1.3-2_amd64.deb ... Unpacking libunistring5:amd64 (1.3-2) ... Selecting previously unselected package gettext. Preparing to unpack .../047-gettext_0.23.1-1_amd64.deb ... Unpacking gettext (0.23.1-1) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../048-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../049-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../050-debhelper_13.24.2_all.deb ... Unpacking debhelper (13.24.2) ... Selecting previously unselected package libbrotli1:amd64. Preparing to unpack .../051-libbrotli1_1.1.0-2+b7_amd64.deb ... Unpacking libbrotli1:amd64 (1.1.0-2+b7) ... Selecting previously unselected package libidn2-0:amd64. Preparing to unpack .../052-libidn2-0_2.3.8-2_amd64.deb ... Unpacking libidn2-0:amd64 (2.3.8-2) ... Selecting previously unselected package libp11-kit0:amd64. Preparing to unpack .../053-libp11-kit0_0.25.5-3_amd64.deb ... Unpacking libp11-kit0:amd64 (0.25.5-3) ... Selecting previously unselected package libtasn1-6:amd64. Preparing to unpack .../054-libtasn1-6_4.20.0-2_amd64.deb ... Unpacking libtasn1-6:amd64 (4.20.0-2) ... Selecting previously unselected package libgnutls30t64:amd64. Preparing to unpack .../055-libgnutls30t64_3.8.9-2_amd64.deb ... Unpacking libgnutls30t64:amd64 (3.8.9-2) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../056-libkrb5support0_1.21.3-5_amd64.deb ... Unpacking libkrb5support0:amd64 (1.21.3-5) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../057-libcom-err2_1.47.2-1+b1_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.2-1+b1) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../058-libk5crypto3_1.21.3-5_amd64.deb ... Unpacking libk5crypto3:amd64 (1.21.3-5) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../059-libkeyutils1_1.6.3-6_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-6) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../060-libkrb5-3_1.21.3-5_amd64.deb ... Unpacking libkrb5-3:amd64 (1.21.3-5) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../061-libgssapi-krb5-2_1.21.3-5_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.21.3-5) ... Selecting previously unselected package libsasl2-modules-db:amd64. Preparing to unpack .../062-libsasl2-modules-db_2.1.28+dfsg1-9_amd64.deb ... Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-9) ... Selecting previously unselected package libsasl2-2:amd64. Preparing to unpack .../063-libsasl2-2_2.1.28+dfsg1-9_amd64.deb ... Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-9) ... Selecting previously unselected package libldap2:amd64. Preparing to unpack .../064-libldap2_2.6.9+dfsg-2_amd64.deb ... Unpacking libldap2:amd64 (2.6.9+dfsg-2) ... Selecting previously unselected package libnghttp2-14:amd64. Preparing to unpack .../065-libnghttp2-14_1.64.0-1_amd64.deb ... Unpacking libnghttp2-14:amd64 (1.64.0-1) ... Selecting previously unselected package libnghttp3-9:amd64. Preparing to unpack .../066-libnghttp3-9_1.8.0-1_amd64.deb ... Unpacking libnghttp3-9:amd64 (1.8.0-1) ... Selecting previously unselected package libngtcp2-16:amd64. Preparing to unpack .../067-libngtcp2-16_1.11.0-1_amd64.deb ... Unpacking libngtcp2-16:amd64 (1.11.0-1) ... Selecting previously unselected package libngtcp2-crypto-gnutls8:amd64. Preparing to unpack .../068-libngtcp2-crypto-gnutls8_1.11.0-1_amd64.deb ... Unpacking libngtcp2-crypto-gnutls8:amd64 (1.11.0-1) ... Selecting previously unselected package libpsl5t64:amd64. Preparing to unpack .../069-libpsl5t64_0.21.2-1.1+b1_amd64.deb ... Unpacking libpsl5t64:amd64 (0.21.2-1.1+b1) ... Selecting previously unselected package librtmp1:amd64. Preparing to unpack .../070-librtmp1_2.4+20151223.gitfa8646d.1-2+b5_amd64.deb ... Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ... Selecting previously unselected package libssh2-1t64:amd64. Preparing to unpack .../071-libssh2-1t64_1.11.1-1_amd64.deb ... Unpacking libssh2-1t64:amd64 (1.11.1-1) ... Selecting previously unselected package libcurl3t64-gnutls:amd64. Preparing to unpack .../072-libcurl3t64-gnutls_8.13.0-1_amd64.deb ... Unpacking libcurl3t64-gnutls:amd64 (8.13.0-1) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../073-liberror-perl_0.17030-1_all.deb ... Unpacking liberror-perl (0.17030-1) ... Selecting previously unselected package git-man. Preparing to unpack .../074-git-man_1%3a2.47.2-0.1_all.deb ... Unpacking git-man (1:2.47.2-0.1) ... Selecting previously unselected package git. Preparing to unpack .../075-git_1%3a2.47.2-0.1_amd64.deb ... Unpacking git (1:2.47.2-0.1) ... Selecting previously unselected package libmd-dev:amd64. Preparing to unpack .../076-libmd-dev_1.1.0-2+b1_amd64.deb ... Unpacking libmd-dev:amd64 (1.1.0-2+b1) ... Selecting previously unselected package libbsd-dev:amd64. Preparing to unpack .../077-libbsd-dev_0.12.2-2_amd64.deb ... Unpacking libbsd-dev:amd64 (0.12.2-2) ... Selecting previously unselected package libclang-cpp19. Preparing to unpack .../078-libclang-cpp19_1%3a19.1.7-3_amd64.deb ... Unpacking libclang-cpp19 (1:19.1.7-3) ... Selecting previously unselected package libcurl4t64:amd64. Preparing to unpack .../079-libcurl4t64_8.13.0-1_amd64.deb ... Unpacking libcurl4t64:amd64 (8.13.0-1) ... Selecting previously unselected package libncurses6:amd64. Preparing to unpack .../080-libncurses6_6.5+20250216-2_amd64.deb ... Unpacking libncurses6:amd64 (6.5+20250216-2) ... Selecting previously unselected package libncurses-dev:amd64. Preparing to unpack .../081-libncurses-dev_6.5+20250216-2_amd64.deb ... Unpacking libncurses-dev:amd64 (6.5+20250216-2) ... Selecting previously unselected package libedit-dev:amd64. Preparing to unpack .../082-libedit-dev_3.1-20250104-1_amd64.deb ... Unpacking libedit-dev:amd64 (3.1-20250104-1) ... Selecting previously unselected package libffi-dev:amd64. Preparing to unpack .../083-libffi-dev_3.4.7-1_amd64.deb ... Unpacking libffi-dev:amd64 (3.4.7-1) ... Selecting previously unselected package libgmpxx4ldbl:amd64. Preparing to unpack .../084-libgmpxx4ldbl_2%3a6.3.0+dfsg-3_amd64.deb ... Unpacking libgmpxx4ldbl:amd64 (2:6.3.0+dfsg-3) ... Selecting previously unselected package libgmp-dev:amd64. Preparing to unpack .../085-libgmp-dev_2%3a6.3.0+dfsg-3_amd64.deb ... Unpacking libgmp-dev:amd64 (2:6.3.0+dfsg-3) ... Selecting previously unselected package libpfm4:amd64. Preparing to unpack .../086-libpfm4_4.13.0+git99-gc5587f9-1_amd64.deb ... Unpacking libpfm4:amd64 (4.13.0+git99-gc5587f9-1) ... Selecting previously unselected package libssl-dev:amd64. Preparing to unpack .../087-libssl-dev_3.5.0-1_amd64.deb ... Unpacking libssl-dev:amd64 (3.5.0-1) ... Selecting previously unselected package libxml2-dev:amd64. Preparing to unpack .../088-libxml2-dev_2.12.7+dfsg+really2.9.14-0.4_amd64.deb ... Unpacking libxml2-dev:amd64 (2.12.7+dfsg+really2.9.14-0.4) ... Selecting previously unselected package libyaml-0-2:amd64. Preparing to unpack .../089-libyaml-0-2_0.2.5-2_amd64.deb ... Unpacking libyaml-0-2:amd64 (0.2.5-2) ... Selecting previously unselected package libyaml-dev:amd64. Preparing to unpack .../090-libyaml-dev_0.2.5-2_amd64.deb ... Unpacking libyaml-dev:amd64 (0.2.5-2) ... Selecting previously unselected package libz3-dev:amd64. Preparing to unpack .../091-libz3-dev_4.13.3-1_amd64.deb ... Unpacking libz3-dev:amd64 (4.13.3-1) ... Selecting previously unselected package lld-19. Preparing to unpack .../092-lld-19_1%3a19.1.7-3_amd64.deb ... Unpacking lld-19 (1:19.1.7-3) ... Selecting previously unselected package llvm-19-runtime. Preparing to unpack .../093-llvm-19-runtime_1%3a19.1.7-3_amd64.deb ... Unpacking llvm-19-runtime (1:19.1.7-3) ... Selecting previously unselected package llvm-19-linker-tools. Preparing to unpack .../094-llvm-19-linker-tools_1%3a19.1.7-3_amd64.deb ... Unpacking llvm-19-linker-tools (1:19.1.7-3) ... Selecting previously unselected package llvm-19. Preparing to unpack .../095-llvm-19_1%3a19.1.7-3_amd64.deb ... Unpacking llvm-19 (1:19.1.7-3) ... Selecting previously unselected package python3-pygments. Preparing to unpack .../096-python3-pygments_2.18.0+dfsg-2_all.deb ... Unpacking python3-pygments (2.18.0+dfsg-2) ... Selecting previously unselected package python3-yaml. Preparing to unpack .../097-python3-yaml_6.0.2-1+b2_amd64.deb ... Unpacking python3-yaml (6.0.2-1+b2) ... Selecting previously unselected package llvm-19-tools. Preparing to unpack .../098-llvm-19-tools_1%3a19.1.7-3_amd64.deb ... Unpacking llvm-19-tools (1:19.1.7-3) ... Selecting previously unselected package llvm-19-dev. Preparing to unpack .../099-llvm-19-dev_1%3a19.1.7-3_amd64.deb ... Unpacking llvm-19-dev (1:19.1.7-3) ... Selecting previously unselected package zlib1g-dev:amd64. Preparing to unpack .../100-zlib1g-dev_1%3a1.3.dfsg+really1.3.1-1+b1_amd64.deb ... Unpacking zlib1g-dev:amd64 (1:1.3.dfsg+really1.3.1-1+b1) ... Setting up media-types (13.0.0) ... Setting up libpipeline1:amd64 (1.5.8-1) ... Setting up libkeyutils1:amd64 (1.6.3-6) ... Setting up bsdextrautils (2.41-4) ... Setting up libmagic-mgc (1:5.45-3+b1) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libyaml-0-2:amd64 (0.2.5-2) ... Setting up libdebhelper-perl (13.24.2) ... Setting up libbrotli1:amd64 (1.1.0-2+b7) ... Setting up libedit2:amd64 (3.1-20250104-1) ... Setting up libmagic1t64:amd64 (1:5.45-3+b1) ... Setting up libnghttp2-14:amd64 (1.64.0-1) ... Setting up gettext-base (0.23.1-1) ... Setting up m4 (1.4.19-7) ... Setting up libevent-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libcom-err2:amd64 (1.47.2-1+b1) ... Setting up file (1:5.45-3+b1) ... Setting up libpcre2-16-0:amd64 (10.45-1) ... Setting up libelf1t64:amd64 (0.192-4) ... Setting up libkrb5support0:amd64 (1.21.3-5) ... Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-9) ... Setting up tzdata (2025b-2) ... Current default time zone: 'Etc/UTC' Local time is now: Sat May 23 04:34:27 UTC 2026. Universal Time is now: Sat May 23 04:34:27 UTC 2026. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up liberror-perl (0.17030-1) ... Setting up autotools-dev (20240727.1) ... Setting up libz3-4:amd64 (4.13.3-1) ... Setting up libpcre2-32-0:amd64 (10.45-1) ... Setting up libpkgconf3:amd64 (1.8.1-4) ... Setting up libgmpxx4ldbl:amd64 (2:6.3.0+dfsg-3) ... Setting up libpfm4:amd64 (4.13.0+git99-gc5587f9-1) ... Setting up libncurses6:amd64 (6.5+20250216-2) ... Setting up libunistring5:amd64 (1.3-2) ... Setting up libjs-codemirror (5.65.0+~cs5.83.9-3) ... Setting up libssl-dev:amd64 (3.5.0-1) ... Setting up autopoint (0.23.1-1) ... Setting up pkgconf-bin (1.8.1-4) ... Setting up libk5crypto3:amd64 (1.21.3-5) ... Setting up libgc1:amd64 (1:8.2.8-1) ... Setting up libsasl2-2:amd64 (2.1.28+dfsg1-9) ... Setting up autoconf (2.72-3) ... Setting up libnghttp3-9:amd64 (1.8.0-1) ... Setting up zlib1g-dev:amd64 (1:1.3.dfsg+really1.3.1-1+b1) ... Setting up libffi8:amd64 (3.4.7-1) ... Setting up libpcre2-posix3:amd64 (10.45-1) ... Setting up dwz (0.15-1+b1) ... Setting up sensible-utils (0.0.24) ... Setting up libuchardet0:amd64 (0.0.8-1+b2) ... Setting up libmd-dev:amd64 (1.1.0-2+b1) ... Setting up libtasn1-6:amd64 (4.20.0-2) ... Setting up git-man (1:2.47.2-0.1) ... Setting up netbase (6.5) ... Setting up libngtcp2-16:amd64 (1.11.0-1) ... Setting up libkrb5-3:amd64 (1.21.3-5) ... Setting up libevent-core-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libssh2-1t64:amd64 (1.11.1-1) ... Setting up libjs-jquery (3.6.1+dfsg+~3.5.14-1) ... Setting up libgc-dev:amd64 (1:8.2.8-1) ... Setting up readline-common (8.2-6) ... Setting up libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.4) ... Setting up libbsd-dev:amd64 (0.12.2-2) ... Setting up libldap2:amd64 (2.6.9+dfsg-2) ... Setting up automake (1:1.17-4) ... update-alternatives: using /usr/bin/automake-1.17 to provide /usr/bin/automake (automake) in auto mode Setting up libfile-stripnondeterminism-perl (1.14.1-2) ... Setting up libllvm19:amd64 (1:19.1.7-3) ... Setting up libz3-dev:amd64 (4.13.3-1) ... Setting up libncurses-dev:amd64 (6.5+20250216-2) ... Setting up gettext (0.23.1-1) ... Setting up libgmp-dev:amd64 (2:6.3.0+dfsg-3) ... Setting up libpcre2-dev:amd64 (10.45-1) ... Setting up libyaml-dev:amd64 (0.2.5-2) ... Setting up libtool (2.5.4-4) ... Setting up libevent-pthreads-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libevent-openssl-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libidn2-0:amd64 (2.3.8-2) ... Setting up libffi-dev:amd64 (3.4.7-1) ... Setting up pkgconf:amd64 (1.8.1-4) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (20) ... Setting up libxml2-dev:amd64 (2.12.7+dfsg+really2.9.14-0.4) ... Setting up libp11-kit0:amd64 (0.25.5-3) ... Setting up libedit-dev:amd64 (3.1-20250104-1) ... Setting up libgssapi-krb5-2:amd64 (1.21.3-5) ... Setting up libevent-extra-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libreadline8t64:amd64 (8.2-6) ... Setting up dh-strip-nondeterminism (1.14.1-2) ... Setting up groff-base (1.23.0-7) ... Setting up llvm-19-linker-tools (1:19.1.7-3) ... Setting up llvm-19-runtime (1:19.1.7-3) ... Setting up lld-19 (1:19.1.7-3) ... Setting up libpython3.13-stdlib:amd64 (3.13.2-3) ... Setting up libpython3-stdlib:amd64 (3.13.2-2) ... Setting up libclang-cpp19 (1:19.1.7-3) ... Setting up libgnutls30t64:amd64 (3.8.9-2) ... Setting up python3.13 (3.13.2-3) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up libpsl5t64:amd64 (0.21.2-1.1+b1) ... Setting up python3 (3.13.2-2) ... Setting up man-db (2.13.0-1) ... Not building database; man-db/auto-update is not 'true'. Setting up python3-pygments (2.18.0+dfsg-2) ... Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ... Setting up libevent-dev (2.1.12-stable-10+b1) ... Setting up libngtcp2-crypto-gnutls8:amd64 (1.11.0-1) ... Setting up crystal (1.14.0+dfsg-1) ... Setting up libcurl4t64:amd64 (8.13.0-1) ... Setting up libcurl3t64-gnutls:amd64 (8.13.0-1) ... Setting up python3-yaml (6.0.2-1+b2) ... Setting up debhelper (13.24.2) ... Setting up git (1:2.47.2-0.1) ... Setting up llvm-19 (1:19.1.7-3) ... Setting up llvm-19-tools (1:19.1.7-3) ... Setting up llvm-19-dev (1:19.1.7-3) ... Processing triggers for libc-bin (2.41-6) ... Reading package lists... Building dependency tree... Reading state information... Reading extended state information... Initializing package states... Writing extended state information... Building tag database... -> Finished parsing the build-deps I: Building the package I: Running cd /build/reproducible-path/crystal-1.14.0+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.14.0+dfsg-1_source.changes dpkg-buildpackage: info: source package crystal dpkg-buildpackage: info: source version 1.14.0+dfsg-1 dpkg-buildpackage: info: source distribution unstable dpkg-buildpackage: info: source changed by David Suárez dpkg-source --before-build . dpkg-buildpackage: info: host architecture amd64 debian/rules clean dh clean dh_auto_clean make -j42 clean make[1]: Entering directory '/build/reproducible-path/crystal-1.14.0+dfsg' rm -rf .build rm -rf ./docs rm -rf src/llvm/ext/llvm_ext.o rm -rf man/*.gz make[1]: Leaving directory '/build/reproducible-path/crystal-1.14.0+dfsg' debian/rules override_dh_clean make[1]: Entering directory '/build/reproducible-path/crystal-1.14.0+dfsg' dh_clean rm -f man/*.gz make[1]: Leaving directory '/build/reproducible-path/crystal-1.14.0+dfsg' debian/rules binary dh binary dh_update_autotools_config dh_autoreconf dh_auto_configure debian/rules override_dh_auto_build make[1]: Entering directory '/build/reproducible-path/crystal-1.14.0+dfsg' 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.14.0+dfsg' Using /usr/bin/llvm-config-19 [version=19.1.7] CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1734712509" 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] [1/1] Codegen (bc+obj) [13/13] [1/1] Codegen (bc+obj) [14/13] Codegen (linking) [14/13] Codegen (linking) make[2]: Leaving directory '/build/reproducible-path/crystal-1.14.0+dfsg' make[1]: Leaving directory '/build/reproducible-path/crystal-1.14.0+dfsg' debian/rules override_dh_auto_test make[1]: Entering directory '/build/reproducible-path/crystal-1.14.0+dfsg' 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.14.0+dfsg' Using /usr/bin/llvm-config-19 [version=19.1.7] CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1734712509" ./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 238 | {% if Crystal::VERSION < "1.2.0" %} ^ Warning: expanding macro There was a problem expanding macro 'macro_140289731020320' Called macro defined in lib/markd/src/markd/renderers/html_renderer.cr:238:7 238 | {% if Crystal::VERSION < "1.2.0" %} Which expanded to: 1 | > 2 | title = URI.encode(node.first_child.text) 3 | @output_io << %() 4 | Warning: Deprecated URI.encode. Use `.encode_path` instead. 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] [1/1] Codegen (bc+obj) [13/13] [1/1] Codegen (bc+obj) [14/13] Codegen (linking) [14/13] Codegen (linking) .build/compiler_spec -v --order=random Randomized with seed: 58326 Semantic: instance var infers type by removing nil from || left side infers type by removing nil from || left side can guess the type from splat argument with splatted type variable can guess the type from splat argument with splatted type variable 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) errors if not initializing super variables (3) errors if not initializing super variables (3) infers from Pointer.malloc infers from Pointer.malloc declares with `self` declares with `self` errors if declaring var in Int32 errors if declaring var in Int32 obeys super module initialize (#456) obeys super module initialize (#456) errors if unknown ivar through macro (#4050) errors if unknown ivar through macro (#4050) infers from another instance var in generic type with type declaration infers from another instance var in generic type with type declaration doesn't infer unbound generic type on non-generic call (#6390) doesn't infer unbound generic type on non-generic call (#6390) 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 error when using generic because guessed elsewhere doesn't error when using generic because guessed elsewhere errors if declaring var in Tuple(*T) errors if declaring var in Tuple(*T) errors if declaring var in Pointer(T) errors if declaring var in Pointer(T) errors if declaring var in Int errors if declaring var in Int 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) infers type from || infers type from || errors if not initializing super variable in generic errors if not initializing super variable in generic infers from method on integer literal, with type annotation infers from method on integer literal, with type annotation declares instance var of generic type, with splat declares instance var of generic type, with splat infers type from ||= infers type from ||= infers type from if infers type from if infers type from string literal infers type from string literal infers type for generic class, with begin infers type for generic class, with begin is more permissive with macro def initialize, bug with named args is more permissive with macro def initialize, bug with named args 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 as infers type from as 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 doesn't solve instance var initializer in instance context (2) (#5876) doesn't solve instance var initializer in instance context (2) (#5876) infers type from literal outside def with initialize and type restriction infers type from literal outside def with initialize and type restriction doesn't consider self.initialize as initializer (#3239) doesn't consider self.initialize as initializer (#3239) infers type for generic class, with T.new infers type for generic class, with T.new declares instance var in module, inherits to type recursively declares instance var in module, inherits to type recursively declares instance var of generic type, with splat inside Proc declares instance var of generic type, with splat inside Proc doesn't complain in second part of #2575 doesn't complain in second part of #2575 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 type for generic class, with case infers type for generic class, with case infers type from named tuple literal infers type from named tuple literal errors if declaring var in StaticArray(T, N) errors if declaring var in StaticArray(T, N) infers type for generic class, with assign (2) infers type for generic class, with assign (2) ignores super module initialize (#456) ignores super module initialize (#456) errors on undefined constant errors on undefined constant declares instance var with initial value, with subclass declares instance var with initial value, with subclass errors if finally not initialized in macro def errors if finally not initialized in macro def 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 type from self as virtual type (#2575) infers type from self as virtual type (#2575) uses T.new (#4291) uses T.new (#4291) errors if declaring var in Enum errors if declaring var in Enum guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) 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 guess the type from splat argument with splatted type can guess the type from splat argument with splatted type infers type from custom generic array literal infers type from custom generic array literal 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 for generic class, with assign (1) infers type for generic class, with assign (1) errors if declaring variable with number errors if declaring variable with number declares instance var of generic type, with virtual metaclass declares instance var of generic type, with virtual metaclass cannot guess type from argument assigned in body cannot guess type from argument assigned in body errors when typing an instance variable inside a method errors when typing an instance variable inside a method declares instance var of generic type, with splat inside Tuple declares instance var of generic type, with splat inside Tuple infers type to be nilable if self is used in same assign infers type to be nilable if self is used in same assign errors if declaring var in Value errors if declaring var in Value declares instance var of generic type, with generic type declares instance var of generic type, with generic type uses virtual types in fun uses virtual types in fun doesn't duplicate instance var in subclass doesn't duplicate instance var in subclass errors with macro def but another def doesn't initialize all errors with macro def but another def doesn't initialize all can't infer type from initializer in generic class type can't infer type from initializer in generic class type errors if declaring var in Class errors if declaring var in Class infers type from ! infers type from ! doesn't solve instance var initializer in instance context (1) (#5876) doesn't solve instance var initializer in instance context (1) (#5876) doesn't crash on recursive method call doesn't crash on recursive method call infers type from tuple literal infers type from tuple literal infers from Pointer.malloc with two arguments infers from Pointer.malloc with two arguments infers type from bool literal infers type from bool literal errors when redeclaring subclass variable with a different type errors when redeclaring subclass variable with a different type can't infer type when using operation on const (#4054) can't infer type when using operation on const (#4054) errors if adds instance variable to Object via guess errors if adds instance variable to Object via guess guesses virtual hash type (2) (#5342) guesses virtual hash type (2) (#5342) 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 number literal infers type from number literal infers from generic class method that has type annotation infers from generic class method that has type annotation guesses from array literal with of, with subclass guesses from array literal with of, with subclass doesn't error if not initialized in macro def but outside it doesn't error if not initialized in macro def but outside it 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 infers from generic class method that has type annotation, without instantiating infers from generic class method that has type annotation, without instantiating errors if not initializing super variables (2) errors if not initializing super variables (2) 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 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 type from lib out (3) infers type from lib out (3) declares instance var of generic class declares instance var of generic class 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 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) doesn't error when redeclaring subclass variable with the same type doesn't error when redeclaring subclass variable with the same type infers type from block argument infers type from block argument infers type from lib out (2) infers type from lib out (2) errors if declaring var in Proc(*T, R) errors if declaring var in Proc(*T, R) errors when using Class (#2605) errors when using Class (#2605) 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 hash literal with of infers type from hash literal with of infers type from custom hash literal in generic infers type from custom hash literal in generic doesn't infer type to be nilable if using self.class doesn't infer type to be nilable if using self.class guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) declares instance var with self, on generic declares instance var with self, on generic infers type from argument with restriction, in generic infers type from argument with restriction, in generic declares instance var of generic type declares instance var of generic type infers type from path that is a constant infers type from path that is a constant declares instance var of generic type, with no type parameter declares instance var of generic type, with no type parameter infers type from assign (1) infers type from assign (1) declares instance var in module, inherits to type declares instance var in module, inherits to type cannot guess the type from splat argument with not splatted type cannot guess the type from splat argument with not splatted type declares instance var of generic type through module declares instance var of generic type through module guesses from new on abstract class guesses from new on abstract class declares instance var of generic module declares instance var of generic module doesn't error if not initializing variables but calling super doesn't error if not initializing variables but calling super infers type from literal outside def infers type from literal outside def infers type for generic class, with T.new and literal infers type for generic class, with T.new and literal says can't infer type if only nil was assigned says can't infer type if only nil was assigned infers type from all call matches infers type from all call matches guesses inside macro for guesses inside macro for says undefined instance variable on assign says undefined instance variable on assign declares instance var of generic type, with proc declares instance var of generic type, with proc infers type for generic class, with lib call infers type for generic class, with lib call can type ivar from module included by generic class (#5281) can type ivar from module included by generic class (#5281) infers type from begin infers type from begin doesn't infer generic type without type argument inside generic doesn't infer generic type without type argument inside generic doesn't solve instance var initializer in instance context (3) (#5876) doesn't solve instance var initializer in instance context (3) (#5876) infers from another instance var in generic type infers from another instance var in generic type infers type from two literals infers type from two literals 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) infers type in multi assign infers type in multi assign says can't infer (#2536) says can't infer (#2536) 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 can't infer type from initializer in non-generic module can't infer type from initializer in non-generic module 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 declares instance var of generic type, with metaclass declares instance var of generic type, with metaclass 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 errors when assigning instance variable at top level block errors when assigning instance variable at top level block uses virtual types in union uses virtual types in union guesses from as.(typeof(...)) in generic type guesses from as.(typeof(...)) in generic type doesn't error if inheriting generic instance (#3635) doesn't error if inheriting generic instance (#3635) infers type for non-generic class, with assign infers type for non-generic class, with assign 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 infer from class method where new is redefined infer from class method where new is redefined infers type from lib fun call infers type from lib fun call errors when using Class in generic type errors when using Class in generic type errors if declaring var in Float errors if declaring var in Float 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 module from non-generic module declares instance var of generic module from non-generic module infers type from instance_sizeof infers type from instance_sizeof 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) declares instance var of generic class after reopen declares instance var of generic class after reopen errors on undefined instance var and subclass calling super errors on undefined instance var and subclass calling super 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 errors when assigning instance variable at top level control block errors when assigning instance variable at top level control block infers type from hash literal from elements infers type from hash literal from elements 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 doesn't error if calling initialize from another initialize (1) doesn't error if calling initialize from another initialize (1) inferrs Proc(Void) to Proc(Nil) inferrs Proc(Void) to Proc(Nil) infers type from range literal infers type from range literal infers type from redefined method if calls previous_def infers type from redefined method if calls previous_def infers type from regex literal with interpolation infers type from regex literal with interpolation doesn't error when using Class but specifying type doesn't error when using Class but specifying type 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 errors if declaring instance variable in module included in Object errors if declaring instance variable in module included in Object infers type for generic class, with literal infers type for generic class, with literal infers type for generic class, with && infers type for generic class, with && infers type from argument default value infers type from argument default value guesses virtual array type (2) (#5342) guesses virtual array type (2) (#5342) infers type from included module, outside def infers type from included module, outside def guesses from as.(typeof(...)) guesses from as.(typeof(...)) infers from class method that has type annotation, with overload infers from class method that has type annotation, with overload doesn't infer for subclass if assigns another type (1) doesn't infer for subclass if assigns another type (1) uses virtual types in self uses virtual types in self declares instance var of generic type, with static array declares instance var of generic type, with static array infers type from hash literal with literals in generic type infers type from hash literal with literals in generic type doesn't combine union of Number and Number subclass (#5073) doesn't combine union of Number and Number subclass (#5073) infers type from argument restriction infers type from argument restriction doesn't crash when inferring from new without matches (#2538) doesn't crash when inferring from new without matches (#2538) errors if declaring var in NamedTuple(T) errors if declaring var in NamedTuple(T) infers from Pointer.malloc in generic type infers from Pointer.malloc in generic type infers type from string interpolation infers type from string interpolation infers from new with return type returning generic infers from new with return type returning generic errors if declaring var in Reference errors if declaring var in Reference 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 from class method that has number literal infers from class method that has number literal infers type from array literal with of infers type from array literal with of says undefined instance variable on read says undefined instance variable on read is more permissive with macro def initialize, multiple is more permissive with macro def initialize, multiple infers from class method that has type annotation infers from class method that has type annotation can type ivar from class inherited by generic class (#5281) can type ivar from class inherited by generic class (#5281) infers type from regex literal infers type from regex literal infers from class method that refers to constant infers from class method that refers to constant doesn't infer type from redefined method doesn't infer type from redefined method errors if declaring generic type without type vars errors if declaring generic type without type vars infers from assign to local var (#2467) infers from assign to local var (#2467) declares instance var declares instance var 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 new expression infers type from new expression allows nil instance var because it's a generic type allows nil instance var because it's a generic type ignores redefined initialize (#456) ignores redefined initialize (#456) errors if declaring var in Union(*T) errors if declaring var in Union(*T) guesses virtual array type (1) (#5342) guesses virtual array type (1) (#5342) errors if declaring var in Object errors if declaring var in Object infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) infers type for generic module infers type for generic module infers type from && infers type from && declares instance var of generic type, with tuple declares instance var of generic type, with tuple doesn't error if not initializing nilable var in subclass doesn't error if not initializing nilable var in subclass infers type from char literal infers type from char literal infers type from array literal in generic type infers type from array literal in generic type declares instance var with initial value declares instance var with initial value infers type from assign (2) infers type from assign (2) can't infer type from initializer can't infer type from initializer infers type for generic class, with if infers type for generic class, with if infers type from uninitialized infers type from uninitialized doesn't error if initializes via super in macro def doesn't error if initializes via super in macro def infers type from enum member infers type from enum member infers type from custom generic hash literal infers type from custom generic hash literal infers type from custom array literal infers type from custom array literal solves instance var initializer in metaclass context (#5876) solves instance var initializer in metaclass context (#5876) declares instance var which appears in initialize declares instance var which appears in initialize errors if declaring var in Number errors if declaring var in Number infers nilable instance var of generic type infers nilable instance var of generic type infers type from array literal from its literals infers type from array literal from its literals 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 path that is a type infers type from path that is a type guesses from splat (#3149) guesses from splat (#3149) infers from restriction using virtual type infers from restriction using virtual type infers type to be nilable if not initialized infers type to be nilable if not initialized infers from new with return type infers from new with return type infers from class method that invokes new infers from class method that invokes new instance variables initializers are used in class variables initialized objects (#3988) instance variables initializers are used in class variables initialized objects (#3988) errors if not initializing super variables errors if not initializing super variables can't infer type of generic method that returns self (#5383) can't infer type of generic method that returns self (#5383) 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 infers type from is_a? infers type from is_a? doesn't error if not initializing variables but calling previous_def (#3210) doesn't error if not initializing variables but calling previous_def (#3210) declares instance var of generic type, with union declares instance var of generic type, with union transfers initializer from generic module to class transfers initializer from generic module to class infers from Pointer.null in generic type infers from Pointer.null in generic type infers type from lib out (1) infers type from lib out (1) declares instance var with union type with a virtual member declares instance var with union type with a virtual member infers type from responds_to? infers type from responds_to? guesses virtual hash type (1) (#5342) guesses virtual hash type (1) (#5342) errors if not initialized in all initialize errors if not initialized in all initialize infers type from custom array literal in generic infers type from custom array literal in generic can't infer type from initializer in generic module type can't infer type from initializer in generic module 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) declares instance var of generic type subclass declares instance var of generic type subclass allow usage of instance variable initializer from instance variable initializer allow usage of instance variable initializer from instance variable initializer infers type from self (#2575) infers type from self (#2575) infers type from array literal with literals in generic type infers type from array literal with literals in generic type infers type from offsetof infers type from offsetof infers from another instance var infers from another instance var doesn't crash on #3580 doesn't crash on #3580 infers type from ||= inside another assignment infers type from ||= inside another assignment infers type from custom hash literal infers type from custom hash literal infers from Pointer.null infers from Pointer.null 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 from Pointer.malloc with two arguments in generic type infers from Pointer.malloc with two arguments in generic type 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 symbol literal infers type from symbol literal infers type from proc literal with return type infers type from proc literal with return type guesses inside macro expression guesses inside macro expression infers type from included module recursively infers type from included module recursively transfers initializer from module to generic class transfers initializer from module to generic class infers from assign to local var in generic type (#2467) infers from assign to local var in generic type (#2467) declares as named tuple declares as named tuple infers type from array literal with of metaclass infers type from array literal with of metaclass accepts overriding inherited instance variable with compatible type accepts overriding inherited instance variable with compatible type declares instance var of generic module (2) declares instance var of generic module (2) doesn't error if calling initialize from another initialize (2) doesn't error if calling initialize from another initialize (2) guesses from hash literal with of, with subclass guesses from hash literal with of, with subclass infers from another instance var with type declaration infers from another instance var with type declaration infers from method in generic type, with type annotation infers from method in generic type, with type annotation instance variable inherited from multiple parents with compatible type module and class, with declarations module and class, 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 accepts module and module, with declarations accepts module and module, with declarations module and class, with definitions module and class, with definitions module and class, with declarations (3) module and class, with declarations (3) with incompatible type errors module and module, with definitions errors module and module, with definitions errors module and module, with declarations errors module and module, with declarations module and class, with declarations module and class, with declarations module and class, with definitions module and class, with definitions is more permissive with macro def initialize, other initialize is more permissive with macro def initialize, other initialize 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 variable infers type from lib variable infers nilable instance var of generic module infers nilable instance var of generic module 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 block argument without restriction infers type from block argument without restriction doesn't error if uses typeof(@var) doesn't error if uses typeof(@var) guesses from splat (2) (#3149) guesses from splat (2) (#3149) 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 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 errors when overriding inherited instance variable with incompatible type errors when overriding inherited instance variable with incompatible type errors when assigning instance variable inside nested expression errors when assigning instance variable inside nested expression doesn't error when using generic in generic type because guessed elsewhere doesn't error when using generic in generic type because guessed elsewhere is more permissive with macro def initialize is more permissive with macro def initialize considers var as assigned in multi-assign considers var as assigned in multi-assign can declare type even if included module has a guessed var can declare type even if included module has a guessed var doesn't check call of non-self instance (#4830) doesn't check call of non-self instance (#4830) 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 included module infers type from included module declares instance var multiple times, last one wins declares instance var multiple times, last one wins guesses inside macro if guesses inside macro if 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 sizeof infers type from sizeof infers type from unless infers type from unless looks up self restriction in instantiated type, not defined type looks up self restriction in instantiated type, not defined type doesn't infer for subclass if assigns another type (2) doesn't infer for subclass if assigns another type (2) infers type from hash literal in generic type infers type from hash literal in generic type Crystal::TextHierarchyPrinter works works shows correct size for members with bound types shows correct size for members with bound types shows correct total size of generic class if known shows correct total size of generic class if known shows correct size for Bool member shows correct size for Bool member shows correct size for Proc inside extern struct shows correct size for Proc inside extern struct Lexer string lexes regex string with escaped slash with %r(...) lexes regex string with escaped slash with %r(...) lexes simple string with %( lexes simple string with %( raises on unterminated heredoc raises on unterminated heredoc lexes regex string with escaped space with /.../ lexes regex string with escaped space with /.../ lexes string with unicode codepoint in curly lexes string with unicode codepoint in curly lexes regex string with escaped space with %r(...) lexes regex string with escaped space with %r(...) lexes heredoc lexes heredoc 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 heredoc with empty line lexes heredoc with empty line lexes regex string lexes regex string raises when identifier doesn't start with a letter or number raises when identifier doesn't start with a letter or number lexes regex string with special chars with /.../ lexes regex string with special chars with /.../ says syntax error on "\"\\u{}\"" says syntax error on "\"\\u{}\"" lexes simple string with nested %( lexes simple string with nested %( lexes slash with no-escape char lexes slash with no-escape char lexes interpolations in heredocs lexes interpolations in heredocs lexes simple string with %| lexes simple string with %| lexes string with unicode codepoint lexes string with unicode codepoint lexes string with slash t lexes string with slash t lexes regex string with escaped slash with /.../ lexes regex string with escaped slash with /.../ lexes string with unicode codepoint in curly multiple times lexes string with unicode codepoint in curly multiple times lexes string with interpolation lexes string with interpolation lexes simple string with nested %< lexes simple string with nested %< says syntax error on "\"\\u{110000}\"" says syntax error on "\"\\u{110000}\"" lexes double numeral lexes double numeral lexes simple string lexes simple string lexes string with slash lexes string with slash lexes string with only newline lexes string with only newline lexes string with numeral lexes string with numeral assigns correct location after heredoc (#346) assigns correct location after heredoc (#346) says syntax error on "\"\\uDFFF\"" says syntax error on "\"\\uDFFF\"" lexes string with literal newline lexes string with literal newline lexes backtick string lexes backtick string lexes heredoc with spaces before close tag lexes heredoc with spaces before close tag says syntax error on "\"\\u{D800}\"" says syntax error on "\"\\u{D800}\"" lexes heredoc with \r\n lexes heredoc with \r\n lexes string with slash quote lexes string with slash quote lexes regex string with special chars with %r(...) lexes regex string with special chars with %r(...) lexes string with newline lexes string with newline says syntax error on "\"\\uD800\"" says syntax error on "\"\\uD800\"" lexes string with interpolation with double numeral lexes string with interpolation with double numeral lexes string with backslash lexes string with backslash raises on unexpected EOF while lexing heredoc raises on unexpected EOF while lexing heredoc lexes simple string with nested %[ lexes simple string with nested %[ Code gen: op assign evaluates exps once, [] (#3398) evaluates exps once, [] (#3398) evaluates exps once (#3398) evaluates exps once (#3398) unreachable finds methods in generic type finds methods in generic type tallies calls tallies calls finds abstract method finds abstract method finds instance methods finds instance methods finds method with `previous_def` finds method with `previous_def` finds virtual method finds virtual method finds class methods finds class methods finds instance methods in nested types finds instance methods in nested types finds method called from instance variable initializer finds method called from instance variable initializer finds top level methods finds top level methods finds method in abstract type finds method in abstract type finds method with `super` finds method with `super` finds methods with proc parameter finds methods with proc parameter ignores autogenerated enum predicates ignores autogenerated enum predicates finds method called from block finds method called from block finds methods called from reachable code finds methods called from reachable code finds method with free variable finds method with free variable finds initializer finds initializer finds method called from expanded macro finds method called from expanded macro finds method called from expanded macro expression finds method called from expanded macro expression finds method called from proc finds method called from proc finds yielding methods finds yielding methods finds shadowed method finds shadowed method handles circular hierarchy references (#14034) handles circular hierarchy references (#14034) Code gen: module expands modules to its including types (2) (#1916) expands modules to its including types (2) (#1916) declares proc with module type and invoke it with two different types that return themselves declares proc with module type and invoke it with two different types that return themselves casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) casts to union of module that is included in other module (#3323) can instantiate generic module can instantiate generic module codegens pointer of module with method with two including types with one struct codegens pointer of module with method with two including types with one struct codegens pointer of module with method with two including types with one struct (2) codegens pointer of module with method with two including types with one struct (2) can use generic module as instance variable type (2) can use generic module as instance variable type (2) codegens proc of a module that was never included codegens proc of a module that was never included codegens module with virtual type codegens module with virtual type declares and includes generic module, in macros T is a tuple literal declares and includes generic module, in macros T is a tuple literal codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block codegens pointer of module with block invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) expands modules to its including types (3) (#1916) expands modules to its including types (3) (#1916) codegens cast to module that includes bool codegens cast to module that includes bool codegens pointer of module with method with two including types codegens pointer of module with method with two including types codegens pointer of module with method codegens pointer of module with method declares proc with module type declares proc with module type codegens pointer of module and pass value to method codegens pointer of module and pass value to method casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) casts to union of generic module that is included in other module (#3323) expands modules to its including types (#1916) expands modules to its including types (#1916) codegens cast to module with class and struct to nilable module codegens cast to module with class and struct to nilable module codegens proc of module when generic type includes it codegens proc of module when generic type includes it codegens dispatch of union with module (#3647) codegens dispatch of union with module (#3647) can use generic module as instance variable type can use generic module as instance variable type Code gen: multi assign supports 1 to n assignment, splat is empty (3) supports 1 to n assignment, splat is empty (3) supports m to n assignment, splat is empty tuple (3) supports m to n assignment, splat is empty tuple (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 1 to n assignment, with splat on left-hand side (3) supports 1 to n assignment, with splat on left-hand side (3) 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) supports m to n assignment, with splat on left-hand side (3) supports m to n assignment, with splat on left-hand side (3) 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) 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 n to n assignment supports n 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, splat is empty (2) supports 1 to n assignment, splat is empty (2) 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, splat is empty tuple (2) supports m to n assignment, splat is empty tuple (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 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 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 m to n assignment, with splat on left-hand side (1) supports m to n assignment, with splat on left-hand side (1) supports 1 to n assignment, with splat on left-hand side (2) supports 1 to n assignment, with splat on left-hand side (2) Semantic: tuples gives error when using named args on Tuple gives error when using named args on Tuple doesn't trigger recursive splat expansion error (#7164) doesn't trigger recursive splat expansion error (#7164) types tuple of one element and then two elements types tuple of one element and then two elements errors on recursive splat expansion (#218) errors on recursive splat expansion (#218) accepts tuple covariance in array accepts tuple covariance in array doesn't unify tuple metaclasses (#5384) doesn't unify tuple metaclasses (#5384) can name a tuple type can name a tuple type #[](RangeLiteral) types, exclusive range types, exclusive range types, begin-less, end-less types, begin-less, end-less gives error when begin index is out of range gives error when begin index is out of range types, inbound begin, end-less types, inbound begin, end-less types, metaclass index types, metaclass index types, inbound begin, nilable types, inbound begin, nilable types, inbound begin types, inbound begin types, out of bound begin, nilable types, out of bound begin, nilable types, begin-less types, begin-less types tuple with splats inside types tuple with splats inside errors on tuple too big (#3816) errors on tuple too big (#3816) can call [] on T can call [] on T #[](NumberLiteral) 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, out of bound, nilable types, out of bound, nilable types, inbound index, nilable types, inbound index, nilable gives error when indexing out of range gives error when indexing out of range types, inbound index types, inbound index can iterate T can iterate T doesn't error if Tuple has no args doesn't error if Tuple has no args errors on recursive splat expansion (1) (#361) errors on recursive splat expansion (1) (#361) 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) #[](Path) works for named tuple indexer works for named tuple indexer works for tuple indexer works for tuple indexer types tuple of one element types tuple of one element accept tuple in type restriction accept tuple in type restriction types T as a tuple of metaclasses types T as a tuple of metaclasses doesn't crash on tuple in not executed block (#6718) doesn't crash on tuple in not executed block (#6718) errors on recursive splat expansion (2) (#361) errors on recursive splat expansion (2) (#361) errors if non-tuple is splatted inside tuple errors if non-tuple is splatted inside tuple errors if using two splat indices on restriction errors if using two splat indices on restriction matches tuple with splat (#2932) matches tuple with splat (#2932) merges two tuple types of same size merges two tuple types of same size allows tuple covariance allows tuple covariance types tuple of three elements types tuple of three elements errors on named tuple too big errors on named tuple too big Crystal::Command clear_cache clears any cached compiler files clears any cached compiler files Normalize: multi assign normalizes 1 to *_ on left-hand side normalizes 1 to *_ on left-hand side normalizes 1 to n, with *_ on left-hand side (3) normalizes 1 to n, with *_ on left-hand side (3) 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 1 to splat on left-hand side normalizes 1 to splat on left-hand side normalizes m to n, with *_ on left-hand side (2) normalizes m to n, with *_ on left-hand side (2) without strict_multi_assign normalizes 1 to n normalizes 1 to n normalizes 1 to n with [] normalizes 1 to n with [] normalizes 1 to n with call normalizes 1 to n with call normalizes n to n normalizes n to n normalizes n to n with [] normalizes n to n with [] normalizes 1 to n, with splat on left-hand side normalizes 1 to n, with 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) strict_multi_assign normalizes 1 to n normalizes 1 to n normalizes 1 to n with call normalizes 1 to n with call normalizes 1 to n with [] normalizes 1 to n with [] normalizes n to *_ on left-hand side normalizes n to *_ on left-hand side normalizes n to splat on left-hand side normalizes n to splat on left-hand side 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 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 m to n, with *_ on left-hand side (1) normalizes m to n, with *_ on left-hand side (1) 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 *_ on left-hand side (3) normalizes m to n, with *_ on left-hand side (3) normalizes n to n with call normalizes n to n with call normalizes 1 to n, with *_ on left-hand side (1) normalizes 1 to n, with *_ on left-hand side (1) Semantic: double splat uses double splat restriction, matches empty uses double splat restriction, matches empty 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) uses double splat in new uses double splat in new matches double splat with regular splat matches double splat with regular splat matches named args producing an empty double splat (#2678) matches named args producing an empty double splat (#2678) 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 double splat restriction with concrete type uses double splat restriction with concrete type double splats named argument into arguments (2) double splats named argument into arguments (2) matches double splat on method with named args and regular args matches double splat on method with named args and regular args matches double splat on method (empty) matches double splat on method (empty) 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 restriction on double splat, doesn't match with empty named tuple uses restriction on double splat, doesn't match with empty named tuple 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 missing argument with double splat errors missing argument with double splat matches double splat on method with named args matches double splat on method with named args Crystal::Repl::Interpreter casts casts from mixed union type to another mixed union type for caller casts from mixed union type to another mixed union type for caller casts from nilable type to mixed union type casts from nilable type to mixed union type casts from reference to nilable reference casts from reference to nilable reference does is_a? with virtual metaclass does is_a? with virtual metaclass upcasts virtual type to union upcasts virtual type to union 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) casts nil to Void* casts nil to Void* puts named tuple type inside union of different named tuple type (#12243) puts named tuple type inside union of different named tuple type (#12243) 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 does is_a? with virtual type (struct) does is_a? with virtual type (struct) casts from mixed union type to primitive type casts from mixed union type to primitive type casts nilable from mixed union type to primitive type (nil case) casts nilable from mixed union type to primitive type (nil case) puts virtual metaclass into union (#12162) puts virtual metaclass into union (#12162) casts from reference to pointer and back casts from reference to pointer and back 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 tuple type inside union of different tuple type (#12243) puts tuple type inside union of different tuple type (#12243) upcasts between named tuple types, same order upcasts between named tuple types, same order upcasts between named tuple types, respects alignment (#14036) upcasts between named tuple types, respects alignment (#14036) 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 to module type upcasts to module type upcasts between tuple types upcasts between tuple types does as? with no resulting type, not from nil (#12327) does as? with no resulting type, not from nil (#12327) casts from nilable type to mixed union type (2) casts from nilable type to mixed union type (2) casts from mixed union type to nilable proc type (#12283) casts from mixed union type to nilable proc type (#12283) upcasts between tuple types, respects alignment (#14036) upcasts between tuple types, respects alignment (#14036) does as? with a type that can't match (#12346) does as? with a type that can't match (#12346) raises when as fails raises when as fails upcasts in nilable cast (#12532) upcasts in nilable cast (#12532) upcasts between named tuple types, different order upcasts between named tuple types, different order discards cast discards cast casts to filtered type, not type in as(...) casts to filtered type, not type in as(...) Crystal::Config .host_target .host_target .linux_runtime_libc .linux_runtime_libc Semantic: splat matches with type var and splat of itself inside explicit Union (2) matches with type var and splat of itself inside explicit Union (2) matches with tuple splat inside explicit Union matches with tuple splat inside explicit Union overloads with type restriction and splat (2) overloads with type restriction and splat (2) overloads with type restriction and splat (3) overloads with type restriction and splat (3) gives correct error when forwarding splat gives correct error when forwarding splat matches type splat with splat in generic type (2) matches type splat with splat in generic type (2) calls super with implicit splat arg (#1001) calls super with implicit splat arg (#1001) overloads with splat against method with two arguments (#986) (1) overloads with splat against method with two arguments (#986) (1) matches with splat matches with splat can splat after type filter left it as a tuple (#442) can splat after type filter left it as a tuple (#442) accesses T when empty, via module accesses T when empty, via module overloads with type restriction and splat (7) overloads with type restriction and splat (7) errors with too few non-splat type arguments (1) errors with too few non-splat type arguments (1) splats arg and splat against splat (1) (#1042) splats arg and splat against splat (1) (#1042) doesn't crash on non-match (#2521) doesn't crash on non-match (#2521) errors with too few non-splat type arguments (2) errors with too few non-splat type arguments (2) errors if doesn't match splat with type restriction errors if doesn't match splat with type restriction overloads with splat against method with two arguments (#986) (2) overloads with splat against method with two arguments (#986) (2) errors on zero args with named arg and splat errors on zero args with named arg and splat doesn't shift a call's location doesn't shift a call's location gives correct error when forwarding splat (2) gives correct error when forwarding splat (2) errors if splatting non-tuple type in call arguments errors if splatting non-tuple type in call arguments splats splats matches with type var splat inside explicit Union matches with type var splat inside explicit Union uses splat restriction, matches empty uses splat restriction, matches empty errors if splatting non-tuple type in return values errors if splatting non-tuple type in return values doesn't match splat in generic type with unsplatted tuple (#10164) doesn't match splat in generic type with unsplatted tuple (#10164) overloads with type restriction and splat (4) overloads with type restriction and splat (4) works if matches splat with type restriction works if matches splat with type restriction allows default value after splat index allows default value after splat index forwards tuple in return statement forwards tuple in return statement uses splat restriction uses splat restriction overloads with type restriction and splat (1) overloads with type restriction and splat (1) method with splat and optional named argument matches zero args call (#2746) method with splat and optional named argument matches zero args call (#2746) says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat Crystal::Splat without splat without splat with splat with splat overloads with type restriction and splat (5) overloads with type restriction and splat (5) matches with type var and splat of itself inside explicit Union (3) matches with type var and splat of itself inside explicit Union (3) matches with type var splat inside explicit Union (2) matches with type var splat inside explicit Union (2) errors if splatting union errors if splatting union splats arg and splat against splat (2) (#1042) splats arg and splat against splat (2) (#1042) overloads with type restriction and splat (6) overloads with type restriction and splat (6) errors if using two splat indices on restriction errors if using two splat indices on restriction says no overload matches on type restrictions past the splat arg says no overload matches on type restrictions past the splat arg uses splat restriction with concrete type uses splat restriction with concrete type doesn't match free var type splats inside explicit Union doesn't match free var type splats inside explicit Union errors if doesn't match splat with type restriction because of zero arguments errors if doesn't match splat with type restriction because of zero arguments errors with too many non-splat type arguments errors with too many non-splat type arguments matches with type var splat inside explicit Union, when all splat elements match matches with type var splat inside explicit Union, when all splat elements match uses bare * uses bare * method with default arguments and splat matches call with one arg (#2766) method with default arguments and splat matches call with one arg (#2766) matches type splat with splat in generic type (1) matches type splat with splat in generic type (1) matches instantiated generic with splat in generic type matches instantiated generic with splat in generic type forwards tuple with an extra argument forwards tuple with an extra argument redefines method with splat (bug #248) redefines method with splat (bug #248) matches partially instantiated generic with splat in generic type matches partially instantiated generic with splat in generic type matches with type var splat inside explicit Union, when one splat fails entirely matches with type var splat inside explicit Union, when one splat fails entirely matches with type var and splat of itself inside explicit Union matches with type var and splat of itself inside explicit Union uses bare *, doesn't let more args uses bare *, doesn't let more args uses splat restriction after non-splat arguments (#5037) uses splat restriction after non-splat arguments (#5037) matches with type var splat inside explicit Union, when non-splat vars fail matches with type var splat inside explicit Union, when non-splat vars fail Semantic: closure doesn't closure typeof local var doesn't closure typeof local var unifies types of closured var (1) unifies types of closured var (1) marks outer fun as closured when using self marks outer fun as closured when using self marks variable as closured in def marks variable as closured in def marks variable as closured in program marks variable as closured in program marks variable as closured in block marks variable as closured in 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 method as self closured if used inside a block marks method as self closured if used inside a block transforms block to proc literal with free var transforms block to proc literal with free var marks method as self closured if explicit self call is made marks method as self closured if explicit self call is made marks outer fun inside a block as closured marks outer fun inside a block as closured doesn't mark var as closured if only used in two block doesn't mark var as closured if only used in two block errors when transforming block to proc literal if type mismatch errors when transforming block to proc literal if type mismatch passes #227 passes #227 allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal can use fun typedef as block type can use fun typedef as block type 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 marks variable as closured in program on assign marks variable as closured in program on assign 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 lookups return type in correct scope lookups return type in correct scope transforms block to proc literal without parameters transforms block to proc literal without parameters errors if forwarding block param doesn't match input type size errors if forwarding block param doesn't match input type size 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 transforms block to proc literal 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 allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize gives error when doing yield inside proc literal gives error when doing yield inside proc literal gives error when doing yield inside proc literal gives error when doing yield inside proc literal 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 crash for non-existing variable (#3789) doesn't crash for non-existing variable (#3789) errors if sending closured proc pointer to C (3) errors if sending closured proc pointer to C (3) marks method as self closured if instance var is read marks method as self closured if instance var is read 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 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 marks method as self closured if instance var is written marks method as self closured if instance var is written errors if sending closured proc pointer to C (2) errors if sending closured proc pointer to C (2) errors if sending closured proc pointer to C (1) errors if sending closured proc pointer to C (1) errors if giving more block args when transforming block to proc literal errors if giving more block args when transforming block to proc literal doesn't mark var as closured if only used in block doesn't mark var as closured if only used in block doesn't closure typeof instance var (#9479) doesn't closure typeof instance var (#9479) 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 says can't send closure to C with new notation says can't send closure to C with new notation transforms block to proc literal with void type transforms block to proc literal with void type marks variable as closured inside block in fun marks variable as closured inside block in fun correctly detects previous var as closured (#5609) correctly detects previous var as closured (#5609) 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 unifies types of closured var (2) unifies types of closured var (2) correctly captures type of closured block arg correctly captures type of closured block arg marks method as self closured if implicit self call is made marks method as self closured if implicit self call is made errors if sending closured proc literal to C errors if sending closured proc literal to C says can't send closure to C with captured block says can't send closure to C with captured block Crystal normalize_path assert assert assert assert assert assert assert assert Semantic: is_a? restricts type inside if scope 1 restricts type inside if scope 1 restricts type inside if else when used with module type restricts type inside if else when used with module type restricts type inside if scope 3 restricts type inside if scope 3 checks simple type with union checks simple type with union is bool is bool doesn't fail on untyped is_a (#10317) doesn't fail on untyped is_a (#10317) applies negative condition filter if then is no return applies negative condition filter if then is no return restricts type in else but lazily restricts type in else but lazily restricts in assignment restricts in assignment restricts other types inside if else restricts other types inside if else does is_a? from virtual metaclass to generic metaclass (#12302) does is_a? from virtual metaclass to generic metaclass (#12302) restricts type inside if scope 2 restricts type inside if scope 2 checks union with union checks union with union types if is_a? preceded by return if (preserves nops) types if is_a? preceded by return if (preserves nops) applies filter inside block applies filter inside block Code gen: c union automatically converts numeric union type in field assignment automatically converts numeric union type in field assignment automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe codegens union property setter 1 via pointer codegens union property setter 1 via pointer codegens struct inside union codegens struct inside union builds union setter with fun type builds union setter with fun type codegens union property default value codegens union property default value codegens union property setter 2 via pointer codegens union property setter 2 via pointer codegens union property default value 2 codegens union property default value 2 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 2 codegens union property setter 2 reads union instance var reads union instance var codegens assign c union to union codegens assign c union to union codegens union property setter 1 codegens union property setter 1 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 aligns to the member with biggest align requirements aligns to the member with biggest align requirements fills union type to the max size fills union type to the max size automatically converts numeric type in field assignment automatically converts numeric type in field assignment Crystal::Repl::Interpreter unions put and remove from union in instance var put and remove from union in instance var put and remove from union, together with is_a? (truthy case) put and remove from union, together with is_a? (truthy case) put and remove from union in local var put and remove from union in local var discards is_a? discards is_a? put and remove from union, together with is_a? (falsey case) put and remove from union, together with is_a? (falsey case) returns union type returns union type converts from NilableType to NonGenericClassType converts from NilableType to NonGenericClassType puts union inside union puts union inside union returns large union type (#15041) returns large union type (#15041) Crystal::Codegen::Target parses freebsd version parses freebsd version normalizes triples normalizes triples parses incomplete triples parses incomplete triples Code gen: method_missing does method_missing macro with virtual type (4) does method_missing macro with virtual type (4) does method_missing macro with included module does method_missing macro with included module 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 block does method_missing macro with block finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' works with named arguments (#3654) works with named arguments (#3654) does method_missing macro with args does method_missing macro with args does method_missing macro with virtual type (7) does method_missing macro with virtual type (7) does method_missing with assignment (bug) does method_missing with assignment (bug) does method_missing macro with block but not using it does method_missing macro with block but not using it does method_missing generating method does method_missing generating method does method_missing with assignment (2) (bug) does method_missing with assignment (2) (bug) does method_missing macro with virtual type (6) does method_missing macro with virtual type (6) does method_missing macro with virtual type (1) does method_missing macro with virtual type (1) does method_missing macro with args (with call) does method_missing macro with args (with call) does method_missing macro without args does method_missing macro without args does method_missing macro without args (with call) does method_missing macro without args (with call) does method_missing macro with virtual type (8) does method_missing macro with virtual type (8) 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 virtual type (3) does method_missing macro with virtual type (3) does method_missing macro with virtual type (5) does method_missing macro with virtual type (5) does method_missing macro with virtual type (2) does method_missing macro with virtual type (2) forwards forwards Semantic: extern struct declares with constructor declares with constructor declares extern struct with no constructor declares extern struct with no constructor can use extern struct in lib can use extern struct in lib errors if using non-primitive for field type via module errors if using non-primitive for field type via module overrides getter overrides getter can include module can include module can be passed to C fun can be passed to C fun errors if using non-primitive for field type errors if using non-primitive for field type errors if using non-primitive type in constructor errors if using non-primitive type in constructor can new with named args can new with named args declares extern union with no constructor declares extern union with no constructor Crystal::Macro Crystal::NamedTupleLiteral executes [] with invalid key type executes [] with invalid key type executes keys executes keys executes empty? executes empty? #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 size executes size executes double splat executes double splat executes [] not found executes [] not found executes values executes values executes is_a? executes is_a? executes has_key? executes has_key? executes map executes map creates a named tuple literal with a var creates a named tuple literal with a var executes [] executes [] executes []= executes []= executes to_a executes to_a executes double splat with arg executes double splat with arg executes double splat executes double splat cast methods executes obj executes obj executes to executes to call methods executes named args executes named args executes receiver executes receiver executes named args value executes named args value executes named args name executes named args name executes name executes name executes block arg (nop) executes block arg (nop) executes args executes args executes block executes block executes block arg executes block arg executes global? executes global? symbol methods forwards methods to string forwards methods to string executes symbol == symbol executes symbol == symbol executes symbol != symbol executes symbol != symbol visibility modifier methods executes visibility executes visibility executes exp executes exp classvar methods executes name executes name flag? doesn't have flag doesn't have flag has flag has flag generic methods executes name executes name executes named_args executes named_args executes resolve executes resolve executes type_vars executes type_vars executes types executes types executes resolve? executes resolve? proc literal methods executes return_type executes return_type executes args executes args executes body executes body assign methods executes target executes target executes value executes value is_a methods executes arg executes arg executes receiver executes receiver expressions methods executes expressions executes expressions Crystal::Alias executes type executes type executes name executes name block methods executes body executes body executes splat_index executes splat_index executes args executes args Crystal::TupleLiteral executes empty? executes empty? executes includes? executes includes? creates a tuple literal with a var creates a tuple literal with a var #map_with_index without the element argument returns the resulting tuple returns the resulting tuple without the index argument returns the resulting tuple returns the resulting tuple without either argument returns the resulting tuple returns the resulting tuple with both arguments returns the resulting tuple returns the resulting tuple executes join with strings executes join with strings executes sort with strings executes sort with strings #- 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 #+ 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 size executes size executes splat with arg executes splat with arg executes [] with computed range executes [] with computed range executes splat with splat executes splat with splat executes [] with 1 executes [] with 1 executes first executes first executes any? (false) executes any? (false) executes unshift executes unshift executes map executes map executes [] with 0 executes [] with 0 executes map with arg executes map with arg executes all? (false) executes all? (false) executes [] with incomplete range executes [] with incomplete range executes join executes join executes all? (true) executes all? (true) #each_with_index 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 without either argument builds the correct array builds the correct array executes find (finds) executes find (finds) executes uniq executes uniq executes find (doesn't find) executes find (doesn't find) executes any? (true) executes any? (true) executes sort with ids and strings executes sort with ids and strings executes is_a? executes is_a? executes sort with numbers executes sort with numbers executes push executes push executes sort with ids executes sort with ids executes map with constants executes map with constants executes splat executes splat #each #each executes last executes last executes splat with symbols and strings executes splat with symbols and strings executes [] out of bounds executes [] out of bounds executes reject executes reject executes [] with range executes [] with range executes select executes select Crystal::Select executes whens executes whens executes else executes else Crystal::TypeOf executes args executes args unary expression methods executes exp executes exp executes is_a? executes is_a? offsetof methods executes offset executes offset executes type executes type executes assign without output executes assign without output while methods executes cond executes cond executes body executes body string methods executes string starts_with? char (true) executes string starts_with? char (true) executes string includes? string (true) executes string includes? string (true) executes string includes? char (true) executes string includes? char (true) executes string ends_with? char (false) executes string ends_with? char (false) executes string + string executes string + string executes [] with exclusive range executes [] with exclusive range executes capitalize executes capitalize executes string > macroid executes string > macroid executes string ends_with? string (false) executes string ends_with? string (false) executes string includes? char (false) executes string includes? char (false) executes [] with computed range executes [] with computed range executes [] with inclusive range executes [] with inclusive range executes downcase executes downcase executes string != string executes string != string executes string < macroid executes string < macroid executes chars executes chars executes to_utf16 executes to_utf16 executes camelcase executes camelcase executes count executes count executes strip executes strip executes string > string executes string > string executes to_i executes to_i executes [] with incomplete range executes [] with incomplete range executes string == string executes string == string executes tr executes tr executes gsub executes gsub executes underscore executes underscore executes upcase executes upcase executes split with argument executes split with argument executes string =~ (false) executes string =~ (false) executes string + char executes string + char executes string < string executes string < string executes lines executes lines executes string starts_with? string (true) executes string starts_with? string (true) executes split with char argument executes split with char argument executes string ends_with? char (true) executes string ends_with? char (true) executes string chomp executes string chomp executes string =~ (true) executes string =~ (true) executes camelcase with lower executes camelcase with lower executes to_i(base) executes to_i(base) executes string ends_with? string (true) executes string ends_with? string (true) executes string includes? string (false) executes string includes? string (false) executes titleize executes titleize executes split without arguments executes split without arguments executes string starts_with? char (false) executes string starts_with? char (false) executes empty executes empty executes size executes size 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 multi_assign methods executes values executes values executes targets executes targets Crystal::Extend executes name executes name number methods preserves integer size (#10713) preserves integer size (#10713) executes > (false) executes > (false) executes + and preserves type executes + and preserves type executes + executes + executes kind executes kind executes | executes | executes <= (true) executes <= (true) executes ** executes ** executes <=> executes <=> #to_number #to_number executes >> executes >> executes < (true) executes < (true) executes > (true) executes > (true) executes <=> (returns nil) executes <=> (returns nil) executes + with float executes + with float executes ^ executes ^ executes < (false) executes < (false) executes - executes - executes * executes * executes unary ~ executes unary ~ executes <= (false) executes <= (false) executes % executes % executes >= (false) executes >= (false) executes math operations using U/Int128 executes math operations using U/Int128 executes unary - executes unary - executes unary + executes unary + executes << executes << executes // executes // executes >= (true) executes >= (true) executes & executes & macro if methods executes then executes then executes else executes else executes cond executes cond type declaration methods executes value executes value executes var executes var executes var when instance var executes var when instance var executes type executes type Crystal::HashLiteral executes values executes values executes of_value executes of_value executes []= executes []= executes keys executes keys executes double splat executes double splat executes double splat executes double splat executes of_value (nop) executes of_value (nop) executes type executes type executes [] not found executes [] not found executes [] executes [] executes map executes map executes of_key executes of_key #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 empty? executes empty? executes is_a? executes is_a? executes has_key? executes has_key? executes size executes size executes of_key (nop) executes of_key (nop) executes to_a executes to_a creates a hash literal with a var creates a hash literal with a var executes type (nop) executes type (nop) executes double splat with arg executes double splat with arg readinstancevar methods executes name executes name executes obj executes obj proc notation methods gets empty output gets empty output executes resolve executes resolve gets multiple inputs gets multiple inputs gets single input gets single input gets single output gets single output executes resolve? executes resolve? arg methods executes internal_name executes internal_name executes default_value executes default_value executes restriction executes restriction executes name executes name require methods executes path executes path global methods executes name executes name macro id methods forwards methods to string forwards methods to string compares with string compares with string compares with symbol compares with symbol Crystal::ArrayLiteral executes empty? executes empty? executes sort with ids and strings executes sort with ids and strings executes sort with numbers executes sort with numbers executes uniq executes uniq executes last executes last executes splat with symbols and strings executes splat with symbols and strings executes [] with two numbers executes [] with two numbers executes join with strings executes join with strings executes splat executes splat executes index out of bounds executes index out of bounds executes splat with splat executes splat with splat executes type executes type executes all? (true) executes all? (true) executes any? (false) executes any? (false) #each #each executes push executes push executes of (nop) executes of (nop) executes map with arg executes map with arg calls block exactly once for each element in #sort_by calls block exactly once for each element in #sort_by executes index 0 executes index 0 executes [] with range executes [] with range executes sort with ids executes sort with ids executes [] with incomplete range executes [] with incomplete range executes size executes size executes map with constants executes map with constants executes reject executes reject executes find (doesn't find) executes find (doesn't find) #map_with_index without the index argument returns the resulting array returns the resulting array with both arguments returns the resulting array returns the resulting array without either argument returns the resulting array returns the resulting array without the element argument returns the resulting array returns the resulting array executes [] with computed range executes [] with computed range executes sort with strings executes sort with strings #- 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 includes? executes includes? executes type (nop) executes type (nop) executes join executes join creates an array literal with a var creates an array literal with a var executes select executes select executes find (finds) executes find (finds) executes map executes map executes index 1 executes index 1 executes reduce with initial value executes reduce with initial value executes unshift executes unshift executes of executes of #each_with_index without either argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the index argument builds the correct array builds the correct array without the element argument builds the correct array builds the correct array executes reduce with no initial value executes reduce with no initial value executes first executes first executes is_a? executes is_a? #+ with TupleLiteral argument concatenates the literals into an ArrayLiteral concatenates the literals into an ArrayLiteral with ArrayLiteral argument concatenates the literals into an ArrayLiteral concatenates the literals into an ArrayLiteral executes all? (false) executes all? (false) executes any? (true) executes any? (true) executes []= executes []= executes sort_by executes sort_by executes identify executes identify Crystal::ClassDef executes superclass executes superclass executes splat_index executes splat_index executes kind executes kind executes type_vars executes type_vars executes body executes body executes name executes name executes struct? executes struct? executes abstract? executes abstract? Crystal::Primitive executes name executes name Crystal::Asm executes inputs executes inputs executes alignstack? executes alignstack? executes outputs executes outputs executes clobbers executes clobbers executes can_throw? executes can_throw? executes intel? executes intel? executes volatile? executes volatile? executes text executes text Crystal::AnnotationDef executes kind executes kind executes body executes body executes name executes name uninitialized var methods executes var executes var executes type executes type path methods executes resolve? executes resolve? executes names executes names executes types executes types executes resolve executes resolve executes global executes global executes global? executes global? env has key has key doesn't have key doesn't have key instancevar methods executes name executes name compares versions compares versions Crystal::MacroExpression executes exp executes exp executes output? executes output? or methods executes right executes right executes left executes left Crystal::ExternalVar executes name executes name executes type executes type executes real_name executes real_name Crystal::LibDef executes name executes name executes body executes body executes kind executes kind Crystal::ModuleDef executes body executes body executes name executes name executes splat_index executes splat_index executes kind executes kind executes type_vars executes type_vars Crystal::RangeLiteral executes map executes map executes excludes_end? executes excludes_end? executes begin executes begin executes to_a executes to_a executes end executes end #each #each exception handler methods executes rescue name executes rescue name executes body executes body executes ensure executes ensure executes else (nop) executes else (nop) executes rescue body executes rescue body executes rescue types executes rescue types executes else executes else executes rescues executes rescues executes ensure (nop) executes ensure (nop) def methods executes name executes name executes splat_index executes splat_index executes block_arg executes block_arg executes accepts_block? executes accepts_block? executes double_splat executes double_splat executes receiver executes receiver executes return_type executes return_type executes abstract? executes abstract? executes free_vars executes free_vars executes body executes body executes visibility executes visibility executes args executes args nilable cast methods executes to executes to executes obj executes obj Crystal::FunDef executes has_body? executes has_body? executes real_name executes real_name executes variadic? executes variadic? executes body executes body executes args executes args executes name executes name executes return_type executes return_type union methods executes resolve? executes resolve? executes resolve executes resolve executes types executes types Crystal::Include executes name executes name Crystal::MacroVar executes expressions executes expressions executes name executes name regex methods executes options executes options executes source executes source node methods #nil? NumberLiteral NumberLiteral Nop Nop NilLiteral NilLiteral executes == on symbols (true) (#240) executes == on symbols (true) (#240) location end line_number end line_number column number column number line_number line_number end column number end column number filename filename #doc_comment 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) 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) ensures each newline has a `#` prefix ensures each newline has a `#` prefix executes == on numbers (false) executes == on numbers (false) executes != on numbers (false) executes != on numbers (false) symbolize 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 expands macro with symbolize call on id expands macro with symbolize call on id executes == on numbers (true) executes == on numbers (true) #is_a? union argument, duplicate type union argument, duplicate type union argument, unimplemented types union argument, unimplemented types union argument, undefined types union argument, undefined types union argument union argument union argument, contains NoReturn union argument, contains NoReturn union argument, mergeable union argument, mergeable id expands macro with id call on call expands macro with id call on call expands macro with id call on path expands macro with id call on path expands macro with id call on number expands macro with id call on number expands macro with id call on symbol expands macro with id call on symbol expands macro with id call on char expands macro with id call on char expands macro with id call on global path expands macro with id call on global path expands macro with id call on string expands macro with id 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 executes == on symbols (false) (#240) executes == on symbols (false) (#240) executes != on numbers (true) executes != on numbers (true) #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 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) stringify 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 symbol expands macro with stringify call on symbol expands macro with stringify call on call expands macro with stringify call on call #parse_type union - Union union - Union union - | union - | raises on non StringLiteral arguments raises on non StringLiteral arguments raises on extra unparsed tokens after the type raises on extra unparsed tokens after the type raises on extra unparsed tokens before the type raises on extra unparsed tokens before the type path path proc proc raises on empty string raises on empty string union - in generic union - in generic metaclass metaclass generic generic exposes syntax warnings exposes syntax warnings splat methods executes exp executes exp control expression methods executes exp (nop) executes exp (nop) executes exp executes exp metaclass methods executes resolve executes resolve executes instance executes instance executes resolve? executes resolve? case methods in executes exhaustive? executes exhaustive? executes whens executes whens executes when exhaustive? executes when exhaustive? when executes exhaustive? executes exhaustive? executes when body executes when body executes else executes else executes when conds executes when conds executes cond executes cond executes whens executes whens executes when exhaustive? executes when exhaustive? metavar methods executes name executes name executes is_a? executes is_a? executes nothing executes nothing executes id executes id Crystal::TypeDef executes name executes name executes type executes type and methods executes right executes right executes left executes left yield methods executes scope (nop) executes scope (nop) executes scope executes scope executes expressions executes expressions executes assign executes assign instancevar methods executes name executes name Crystal::MacroLiteral executes value executes value Crystal::CStructOrUnionDef executes name executes name executes union? executes union? executes kind executes kind executes body executes body responds_to methods executes receiver executes receiver executes name executes name #warning emits a top level warning emits a top level warning Crystal::AsmOperand executes constraint executes constraint executes exp executes exp proc pointer methods executes global? executes global? executes args when not empty executes args when not empty executes args when empty executes args when empty executes name executes name executes obj when absent executes obj when absent executes obj when present executes obj when present Crystal::External executes is_a? executes is_a? annotation methods executes [] with StringLiteral executes [] with StringLiteral 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 executes [] with NumberLiteral executes [] with NumberLiteral executes name executes name Crystal::TypeNode #nilable? false false true true executes class vars executes class vars executes == executes == #class? Crystal::GenericClassType struct struct class class Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericClassType class class struct struct #union? false false true true visibility public public private private executes < executes < executes size of tuple executes size of tuple executes > executes > #warning emits a warning at a specific node emits a warning at a specific node #module? Crystal::NonGenericClassType struct struct class class Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::GenericClassType class class struct struct executes resolve executes resolve executes instance_vars executes instance_vars #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) 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 generic type arguments prints generic type arguments 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) simple type returns the name of the type returns the name of the type generic type includes the generic_args of the instantiated type by default includes the generic_args of the instantiated type by default includes the generic_args of the type by default includes the generic_args of the 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 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 namespaced type should return the FQN of the type should return the FQN of the type executes resolve? executes resolve? executes class_vars on metaclass executes class_vars on metaclass executes instance_vars on metaclass executes instance_vars on metaclass == and != devirtualize generic type arguments (#10730) == and != devirtualize generic type arguments (#10730) executes instance_vars on symbol type executes instance_vars on symbol type #abstract? Crystal::GenericClassType class abstract abstract non-abstract non-abstract struct abstract abstract non-abstract non-abstract Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericClassType class non-abstract non-abstract abstract abstract struct non-abstract non-abstract abstract abstract Crystal::NonGenericModuleType Crystal::NonGenericModuleType executes private? true true false false executes class methods executes class methods executes type_vars executes type_vars executes >= executes >= #struct? Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::GenericModuleType Crystal::GenericModuleType Crystal::GenericClassType class class struct struct Crystal::NonGenericClassType struct struct class class #has_inner_pointers? works on primitive values works on primitive values works on references works on references works on structs works on structs works on ReferenceStorage works on ReferenceStorage executes size of tuple metaclass executes size of tuple metaclass executes instance executes instance #includers returns an array of types `self` is directly included in returns an array of types `self` is directly included in executes superclass executes superclass executes union_types (non-union) executes union_types (non-union) executes union_types (union) executes union_types (union) #id does not include trailing + for virtual type does not include trailing + for virtual type executes ancestors (with generic) executes ancestors (with generic) executes class vars (with inheritance) executes class vars (with inheritance) executes class_vars on symbol type executes class_vars on symbol type executes ancestors executes ancestors executes class executes class executes methods executes methods executes <= executes <= executes != executes != public? false false true true if methods executes cond executes cond executes then executes then executes else (nop) executes else (nop) executes else executes else char methods executes ord executes ord macro methods executes visibility executes visibility executes splat_index executes splat_index executes name executes name executes args executes args executes block_arg executes block_arg executes body executes body executes double_splat executes double_splat printing p! p! p p pp pp print print pp! pp! puts puts Crystal::EnumDef executes body executes body executes kind executes kind executes base_type executes base_type executes name executes name macro for methods executes exp executes exp executes vars executes vars executes body executes body 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) classes does constructor does constructor does allocate, set instance var and get instance var does allocate, set instance var and get instance var discards allocate discards allocate calls explicit struct self method calls explicit struct self method calls implicit struct self method calls implicit struct self method does object_id does object_id interprets read instance var interprets read instance var calls implicit class self method calls implicit class self method downcasts virtual type to its only type (#12351) downcasts virtual type to its only type (#12351) Semantic: enum errors if using instance var inside enum (#991) errors if using instance var inside enum (#991) attaches annotation to enum method (#6690) attaches annotation to enum method (#6690) errors if declaring type inside enum (#3127) errors if declaring type inside enum (#3127) errors on enum without members (#3447) errors on enum without members (#3447) gives error on enum overflow after a member with value gives error on enum overflow after a member with value doesn't visit enum members generated by macros twice (#10104) doesn't visit enum members generated by macros twice (#10104) errors if reopen but not enum errors if reopen but not enum 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) disallows redefining None to non-0 for @[Flags] enum disallows redefining None to non-0 for @[Flags] enum gives error on flags enum overflow gives error on flags enum overflow errors if reopening enum with different base type (2) errors if reopening enum with different base type (2) 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 reopens enum with same base type (2) reopens enum with same base type (2) finds method in enum type finds method in enum type reopens enum without base type (2) reopens enum without base type (2) can use macro for inside enum can use macro for inside enum errors if inheriting Enum (#3592) errors if inheriting Enum (#3592) has All value when defined as @[Flags] has All value when defined as @[Flags] gives error on unsigned flags enum overflow after a member with value gives error on unsigned flags enum overflow after a member with value errors if reopening enum with different base type (1) errors if reopening enum with different base type (1) errors if declaring type inside enum, nested (#3127) errors if declaring type inside enum, nested (#3127) allows redefining None to 0 for @[Flags] enum allows redefining None to 0 for @[Flags] enum 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 errors if enum value is too big for type (#678) errors if enum value is too big for type (#678) 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 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 redefine Enum.new can redefine Enum.new errors if defining initialize in Enum (#7238) errors if defining initialize in Enum (#7238) types enum value types enum value reopens enum without base type (1) reopens enum without base type (1) doesn't overflow on flags member (#7877) doesn't overflow on flags member (#7877) doesn't overflow when going from negative to zero (#7874) doesn't overflow when going from negative to zero (#7874) gives error on signed flags enum overflow after a member with value gives error on signed flags enum overflow after a member with value creates enum from value creates enum from value disallows All value for @[Flags] enum disallows All value for @[Flags] enum marks as flags with base type (#2185) marks as flags with base type (#2185) reopens an enum reopens an 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 using a name twice errors if using a name twice types enum types enum 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) allows class vars in enum allows class vars in enum gives error on enum overflow gives error on enum overflow defines method on enum defines method on enum finds class method in enum type finds class method in enum type defines class method on enum defines class method on enum Normalize: proc pointer normalizes proc pointer with global const receiver normalizes proc pointer with global const receiver normalizes proc pointer with parameters, without object normalizes proc pointer with parameters, without object normalizes proc pointer with const receiver normalizes proc pointer with const receiver normalizes proc pointer with variable receiver normalizes proc pointer with variable receiver normalizes proc pointer of global call normalizes proc pointer of global call normalizes proc pointer with ivar receiver normalizes proc pointer with ivar receiver normalizes proc pointer with cvar receiver normalizes proc pointer with cvar receiver normalizes proc pointer without object normalizes proc pointer without object Code gen: exception executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else executes ensure of break inside while inside else catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) catches exception thrown by as inside method (#4030) executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes return inside rescue, executing ensure executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure when no exception is raised (2) executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can rescue TypeCastError (#2607) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) can use argument in rescue, with a different type (1) (#2844) executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block executes ensure of next inside block does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union does not rescue just any union can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) can use argument in rescue, with a different type (2) (#2844) executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns executes ensure when the main block returns runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 closures rescue variable (#8141) closures rescue variable (#8141) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure when exception is raised (1) executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure of break inside block executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) executes ensure when exception is unhandled (2) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) does ensure after rescue which returns (#171) codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception codegens rescue specific leaf exception rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue rescues with types defaults to generic rescue can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) can result into union (2) doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 doesn't crash on #1988 executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes else if no exception is raised (1) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) executes ensure of calling method when doing break inside block (#1233) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) runs NoReturn ensure (#3082) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) can use argument in rescue (#2844) codegens issue #118 (2) codegens issue #118 (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) doesn't execute else if exception is raised conditionally (2) executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body executes ensure of break inside while inside body receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object receives exception object executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally executes rescue if something is raised conditionally codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value codegens return from rescue with value executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body executes ensure of next inside while inside body ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue ensure without rescue does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module does not rescue just any module handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type handles rescuing module type executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue executes ensure of break inside while inside rescue handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal handle exception raised by proc literal types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) types parenthesized expression (#5511) handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions handles nested exceptions executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes body if nothing raised (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is unhandled (1) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) executes ensure when exception is raised (2) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) handle multiple exception types (1) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) doesn't execute else if exception is raised (2) handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types handles rescuing union between module types executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue executes ensure when raising inside rescue rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type rescues with type doesn't codegen duplicated ensure if unreachable (#709) doesn't codegen duplicated ensure if unreachable (#709) codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return codegens exception handler with return handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type handles rescuing union between module type and class type uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue uses exception after rescue executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure from return until target executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure of break inside while inside body with block executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns executes ensure when the main block yields and returns handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) handle multiple exception types (2) executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers executes ensure of break inside while inside body with nested handlers propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) propagates raise status (#2074) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) executes ensure when no exception is raised (1) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) handles exception in outer block (2) rescues a valid union rescues a valid union rescues a valid union rescues a valid union rescues a valid union rescues a valid union rescues a valid union rescues a valid union rescues a valid union rescues a valid union captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc captures exception thrown from proc doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) doesn't execute else if exception is raised (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) can result into union (1) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) executes else if no exception is raised (2) rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union rescues a valid nested union executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally executes rescue if something is raised unconditionally codegens issue #118 (1) codegens issue #118 (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) handles exception in outer block (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) doesn't execute else if exception is raised conditionally (1) handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass Semantic: proc disallows Enum in proc return types disallows Enum in proc return types allows new on proc type with less block params allows new on proc type with less block params disallows Float in proc notation parameter type disallows Float in proc notation parameter type allows metaclass in procs allows metaclass in procs disallows Pointer in proc notation parameter type disallows Pointer in proc notation parameter type disallows Object in proc pointer disallows Object in proc pointer disallows Proc in procs disallows Proc in procs types proc pointer with a type that was never instantiated types proc pointer with a type that was never instantiated disallows Class in procs disallows Class in procs disallows Number in captured block disallows Number in captured block disallows Int in captured block disallows Int in captured block disallows Proc in proc pointer disallows Proc in proc pointer errors when using local variable with proc argument name errors when using local variable with proc argument name allows invoking a function with a generic subtype (1) allows invoking a function with a generic subtype (1) allows new on proc type that is a lib alias allows new on proc type that is a lib alias disallows StaticArray in captured block disallows StaticArray in captured block passes proc pointer as block with arguments passes proc pointer as block with arguments allows using Proc as restriction (2) allows using Proc as restriction (2) types a proc pointer with generic types types a proc pointer with generic types disallows Class in proc notation return type disallows Class in proc notation return type binds proc literal to arguments and body binds proc literal to arguments and body allows passing NoReturn type for any return type, with Proc notation (#12126) allows passing NoReturn type for any return type, with Proc notation (#12126) disallows Float in procs disallows Float in procs ... ... forwards block and computes correct type (bug) forwards block and computes correct type (bug) *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) has proc literal as restriction and errors if sizes are different has proc literal as restriction and errors if sizes are different errors when using macro as proc value (top-level with obj) (#7465) errors when using macro as proc value (top-level with obj) (#7465) allows metaclass in proc pointer allows metaclass in proc pointer disallows Value in proc notation parameter type disallows Value in proc notation parameter type disallows Struct in procs disallows Struct in procs types int proc literal types int proc literal disallows Proc in proc notation parameter type disallows Proc in proc notation parameter type disallows Pointer in procs disallows Pointer in procs types int -> int proc call types int -> int proc call disallows StaticArray in proc notation return type disallows StaticArray in proc notation return type accesses T and R accesses T and R can pass proc that returns T as Void with named args (#7523) can pass proc that returns T as Void with named args (#7523) types proc pointer with types types proc pointer with types can assign NoReturn proc to other proc (#3032) can assign NoReturn proc to other proc (#3032) disallows Object in proc notation return type disallows Object in proc notation return type allows passing union including module to proc allows passing union including module to proc can match *T in block argument can match *T in block argument allows implicit cast of proc to return void in non-generic restriction allows implicit cast of proc to return void in non-generic restriction types proc type spec types proc type spec disallows Class in proc notation parameter type disallows Class in proc notation parameter type errors if inferred return type doesn't match return type restriction (1) errors if inferred return type doesn't match return type restriction (1) allows passing NoReturn type for any return type (1) allows passing NoReturn type for any return type (1) disallows Int in procs disallows Int in procs disallows Float in proc pointer disallows Float in proc pointer disallows Float in proc return types disallows Float in proc return types disallows Value in captured block disallows Value in captured block 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 Object in proc notation parameter type disallows Object in proc notation parameter type disallows Proc in captured block disallows Proc in captured block errors if missing argument type in proc literal errors if missing argument type in proc literal disallows Int in proc notation return type disallows Int in proc notation return type allows casting a proc type to one with void argument allows casting a proc type to one with void argument allows passing NoReturn type for any return type (3) allows passing NoReturn type for any return type (3) has proc literal as restriction and errors if output is different has proc literal as restriction and errors if output is different 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 types proc call types proc call types proc literal with return type (1) types proc literal with return type (1) disallows Proc in proc notation return type disallows Proc in proc notation return type allows metaclass in proc notation return type allows metaclass in proc notation return type 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) disallows Class in captured block disallows Class in captured block allows implicit cast of proc to return void in LibC function allows implicit cast of proc to return void in LibC function disallows Enum in procs disallows Enum in procs types nil or proc type types nil or proc type types proc literal hard type inference (1) types proc literal hard type inference (1) disallows Int in proc pointer disallows Int in proc pointer disallows Struct in proc notation return type disallows Struct in proc notation return type disallows Number in proc pointer disallows Number in proc pointer disallows Number in proc notation return type disallows Number in proc notation return type types proc call with return type types proc call with return type disallows Reference in procs disallows Reference in procs can use @ivar as pointer syntax receiver (#9239) can use @ivar as pointer syntax receiver (#9239) allows passing function to LibC without specifying types, using a class method allows passing function to LibC without specifying types, using a class method doesn't crash on constant to proc pointer doesn't crash on constant to proc pointer has proc literal as restriction and works has proc literal as restriction and works doesn't need to deduce type of block if return is void doesn't need to deduce type of block if return is void allows passing proc type if it is typedef'd allows passing proc type if it is typedef'd 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 allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable disallows Pointer in captured block disallows Pointer in captured block disallows Value in proc notation return type disallows Value in proc notation return type says wrong number of block params in new on proc type says wrong number of block params in new on proc type uses array argument of proc arg (1) uses array argument of proc arg (1) gets pointer to lib fun without specifying types gets pointer to lib fun without specifying types can use @@cvar as pointer syntax receiver (#9239) can use @@cvar as pointer syntax receiver (#9239) virtualizes proc type (#6789) virtualizes proc type (#6789) disallows Tuple in proc pointer disallows Tuple in proc pointer disallows Pointer in proc notation return type disallows Pointer in proc notation return type disallows Int in proc return types disallows Int in proc return types says wrong return type in new on proc type says wrong return type in new on proc type disallows Tuple in proc return types disallows Tuple in proc return types 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) types proc pointer to instance method types proc pointer to instance method disallows Tuple in proc notation parameter type disallows Tuple in proc notation parameter type accesses T inside variadic generic accesses T inside variadic generic allows metaclass in captured block allows metaclass in captured block allows using Proc as restriction (3) allows using Proc as restriction (3) allows passing nil as proc callback if it is a lib alias allows passing nil as proc callback if it is a lib alias disallows StaticArray in proc return types disallows StaticArray in proc return types disallows Value in proc return types disallows Value in proc return types disallows Struct in captured block disallows Struct in captured block disallows StaticArray in procs disallows StaticArray in procs disallows casting a proc type to one accepting more arguments disallows casting a proc type to one accepting more arguments disallows Value in proc pointer disallows Value in proc pointer allows new on proc type allows new on proc type doesn't cause upcast bug (#8428) doesn't cause upcast bug (#8428) disallows Class in proc return types disallows Class in proc return types disallows Struct in proc return types disallows Struct in proc return types disallows Int in proc notation parameter type disallows Int in proc notation parameter type allows passing function to LibC without specifying types allows passing function to LibC without specifying types uses array argument of proc arg (3) uses array argument of proc arg (3) says wrong number of arguments says wrong number of arguments disallows StaticArray in proc pointer disallows StaticArray in proc pointer types int -> int proc literal types int -> int proc literal disallows Float in captured block disallows Float in captured block doesn't let passing an non-covariant generic argument doesn't let passing an non-covariant generic argument allows passing NoReturn type for any return type (2) allows passing NoReturn type for any return type (2) allows metaclass in proc notation parameter type allows metaclass in proc notation parameter type disallows Reference in proc notation parameter type disallows Reference in proc notation parameter type declares an instance variable with splat in proc notation declares an instance variable with splat in proc notation errors if inferred return type doesn't match return type restriction (2) errors if inferred return type doesn't match return type restriction (2) disallows Proc in proc return types disallows Proc in proc return types disallows Struct in proc notation parameter type disallows Struct in proc notation parameter type casts to Proc(Nil) when specified in return type casts to Proc(Nil) when specified in return type doesn't capture closured var if using typeof doesn't capture closured var if using typeof virtualizes proc type with -> (#8730) virtualizes proc type with -> (#8730) types Proc(*T, Void) as Proc(*T, Nil) types Proc(*T, Void) as Proc(*T, Nil) allows implicit cast of proc to return void in generic restriction allows implicit cast of proc to return void in generic restriction 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 Reference in captured block disallows Reference in captured block types proc pointer types proc pointer allows using Proc as restriction (1) allows using Proc as restriction (1) disallows Reference in proc notation return type disallows Reference in proc notation return type disallows Enum in captured block disallows Enum in captured block disallows Object in procs disallows Object in procs disallows Object in proc return types disallows Object in proc return types disallows Tuple in captured block disallows Tuple 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) disallows Enum in proc pointer disallows Enum in proc pointer disallows Number in proc return types disallows Number in proc return types finds method of object finds method of object types proc literal with return type (2) types proc literal with return type (2) disallows StaticArray in proc notation parameter type disallows StaticArray in proc notation parameter type merges return type merges return type disallows Tuple in procs disallows Tuple in procs accesses T inside variadic generic, in proc notation accesses T inside variadic generic, in proc notation disallows Class in proc pointer disallows Class in proc pointer disallows Float in proc notation return type disallows Float in proc notation return type has proc literal as restriction and errors if input is different has proc literal as restriction and errors if input is different errors when using macro as proc value (inside method) (#7465) errors when using macro as proc value (inside method) (#7465) disallows Tuple in proc notation return type disallows Tuple in proc notation return type types proc literal with a type that was never instantiated types proc literal with a type that was never instantiated types empty proc literal types empty proc literal disallows Struct in proc pointer disallows Struct in proc pointer disallows Number in proc notation parameter type disallows Number in proc notation parameter type disallows Pointer in proc pointer disallows Pointer in proc pointer allows metaclass in proc return types allows metaclass in proc return types uses array argument of proc arg (4) uses array argument of proc arg (4) has proc literal as restriction and works when output not specified has proc literal as restriction and works when output not specified disallows Reference in proc pointer disallows Reference in proc pointer 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 Value in procs disallows Value in procs 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) errors when using macro as proc value (top-level) (#7465) errors when using macro as proc value (top-level) (#7465) 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 invoking a function with a generic subtype (2) allows invoking a function with a generic subtype (2) disallows casting a proc type to one accepting less arguments disallows casting a proc type to one accepting less arguments disallows Object in captured block disallows Object in captured block allows passing proc type if it is a lib alias allows passing proc type if it is a lib alias gives correct error message when proc return type is incorrect (#219) gives correct error message when proc return type is incorrect (#219) 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) disallows Number in procs disallows Number in procs uses array argument of proc arg (2) uses array argument of proc arg (2) allows writing a function type with Proc allows writing a function type with Proc disallows Pointer in proc return types disallows Pointer in proc return types passes proc pointer as block passes proc pointer as block *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) disallows Enum in proc notation parameter type disallows Enum in proc notation parameter type accesses T inside variadic generic (2) accesses T inside variadic generic (2) allows passing virtual type including module to proc allows passing virtual type including module to proc Semantic: lib errors if lib already specified with positional argument errors if lib already specified with positional argument errors if missing link arguments errors if missing link arguments errors if defining incompatible funs with the same name in different libs (#3045) errors if defining incompatible funs with the same name in different libs (#3045) errors if using void as parameter (related to #508) errors if using void as parameter (related to #508) errors if using unknown named param errors if using unknown named param passes int as another integer type with literal passes int as another integer type with literal reports error when changing instance var type and something breaks reports error when changing instance var type and something breaks can use named args can use named args defined fun with aliased type defined fun with aliased type reports error on fun argument type not primitive like reports error on fun argument type not primitive like types fun returning nothing as nil types fun returning nothing as nil errors if unknown named arg errors if unknown named arg errors if using out with void pointer (#2424) errors if using out with void pointer (#2424) allows dll argument allows dll argument types fun returning void as nil types fun returning void as nil errors if using out with varargs errors if using out with varargs reports error out can only be used with lib funs in named argument reports error out can only be used with lib funs in named argument errors if lib named arg is not a String errors if lib named arg is not a String errors if using void via typedef as parameter (related to #508) errors if using void via typedef as parameter (related to #508) reports redefinition of fun with different signature reports redefinition of fun with different signature raises wrong number of arguments raises wrong number of arguments errors if CallConvention argument is not a valid string errors if CallConvention argument is not a valid string errors if third argument is not a bool errors if third argument is not a bool types lib var get with forward declaration types lib var get with forward declaration reports error out can only be used with lib funs reports error out can only be used with lib funs errors if CallConvention argument is not a string errors if CallConvention argument is not a string specifies a call convention specifies a call convention types fun returning nil as nil types fun returning nil as nil allows passing double splat to LibC fun allows passing double splat to LibC fun error if passing non primitive type as varargs error if passing non primitive type as varargs can use tuple as fun return can use tuple as fun return errors if using out with non-pointer errors if using out with non-pointer overrides definition of fun overrides definition of fun errors if parameter already specified errors if parameter already specified errors if too many link arguments errors if too many link arguments reopens lib and adds same link annotations reopens lib and adds same link annotations errors if using out with void pointer through type errors if using out with void pointer through type errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call errors if defining incompatible funs with the same name in the same lib (#3045) errors if defining incompatible funs with the same name in the same lib (#3045) can use out with named args can use out with named args gathers link annotations from macro expression gathers link annotations from macro expression allows invoking out with underscore allows invoking out with underscore errors if missing arguments errors if missing arguments types a varargs external types a varargs external doesn't try to invoke unsafe for c struct/union (#1362) doesn't try to invoke unsafe for c struct/union (#1362) raises on undefined fun raises on undefined fun allows passing splat to LibC fun allows passing splat to LibC fun errors if first argument is not a string errors if first argument is not a string reports error if using out with an already declared variable reports error if using out with an already declared variable clears annotations after lib clears annotations after lib can use macros inside struct can use macros inside struct passes float as another integer type in variable passes float as another integer type in variable defines lib funs before funs with body defines lib funs before funs with body specifies a call convention to a lib specifies a call convention to a lib errors if missing argument errors if missing argument errors if dll argument does not end with '.dll' errors if dll argument does not end with '.dll' errors if second argument is not a string errors if second argument is not a string errors if wrong number of arguments for CallConvention errors if wrong number of arguments for CallConvention reports error when changing var type and something breaks reports error when changing var type and something breaks errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type can list lib functions at the top level (#12395) can list lib functions at the top level (#12395) warns if @[Link(static: true)] is specified warns if @[Link(static: true)] is specified errors if dll argument contains directory separators errors if dll argument contains directory separators correctly attached link flags if there's a macro if correctly attached link flags if there's a macro if error if passing type to LibC with to_unsafe but type doesn't match error if passing type to LibC with to_unsafe but type doesn't match errors if defines def on lib errors if defines def on lib errors if redefining fun with different signature (#2468) errors if redefining fun with different signature (#2468) errors if lib fun call is part of dispatch errors if lib fun call is part of dispatch errors if assigning void lib call to var (#4414) errors if assigning void lib call to var (#4414) can use macros inside lib can use macros inside lib raises wrong argument type raises wrong argument type supports forward references (#399) supports forward references (#399) passes int as another integer type in variable passes int as another integer type in variable reports error on fun return type not primitive like reports error on fun return type not primitive like types lib var get types lib var get warns if Link annotations use positional arguments warns if Link annotations use positional arguments errors if passing void lib call to call argument (#4414) errors if passing void lib call to call argument (#4414) reopens lib and adds more link annotations reopens lib and adds more link annotations reports error on fun argument type not primitive like, Nil (#2994) reports error on fun argument type not primitive like, Nil (#2994) reports error on typedef type not primitive like reports error on typedef type not primitive like errors if using named args with variadic function errors if using named args with variadic function types lib var set types lib var set reports error on struct field type not primitive like reports error on struct field type not primitive like supports forward references with struct inside struct (#399) supports forward references with struct inside struct (#399) allows invoking lib call without obj inside lib allows invoking lib call without obj inside lib error if passing non primitive type as varargs invoking to_unsafe error if passing non primitive type as varargs invoking to_unsafe errors if fourth argument is not a bool errors if fourth argument is not a bool disallows passing nil or pointer to arg expecting pointer disallows passing nil or pointer to arg expecting pointer Semantic: while types endless while with break without value types endless while with break without value 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) types while with assignment types while with assignment types while (true) as NoReturn types while (true) as NoReturn types while with multiple breaks with value types while with multiple breaks with value 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 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 (3) doesn't use type at end of endless while if variable is reassigned (3) types variable as nilable if raise before assign types variable as nilable if raise before assign types while types while doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition rebinds condition variable after while body (#6158) rebinds condition variable after while body (#6158) doesn't modify var's type before while doesn't modify var's type before while finds all while cond assign targets in expressions (2) finds all while cond assign targets in expressions (2) finds all while cond assign targets in expressions (4) finds all while cond assign targets in expressions (4) types while with assignment and && types while with assignment and && reports break cannot be used outside a while reports break cannot be used outside a while types while true as NoReturn types while true as NoReturn doesn't type var as nilable after break inside rescue doesn't type var as nilable after break inside rescue 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 types while with && (#1425) types while with && (#1425) types while with assignment and call types while with assignment and call doesn't restrict type after while if there's a break (#4242) doesn't restrict type after while if there's a break (#4242) doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition 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 (#10350) finds all while cond assign targets in expressions (#10350) finds all while cond assign targets in expressions (3) finds all while cond assign targets in expressions (3) uses var type inside while if endless loop (2) uses var type inside while if endless loop (2) reports next cannot be used outside a while reports next cannot be used outside a while finds all while cond assign targets in expressions (5) finds all while cond assign targets in expressions (5) types while with break without value types while with break without value 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 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 types while ((true)) as NoReturn types while ((true)) as NoReturn doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (2) types endless while with break with value types endless while with break with value types while with break with value types while with break with value restricts type after while (#4242) restricts type after while (#4242) 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 endless while with multiple breaks with value types endless while with multiple breaks with value finds all while cond assign targets in expressions (6) finds all while cond assign targets in expressions (6) doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) Semantic: offsetof can be used with classes can be used with classes 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 offsetof element of uninstantiated generic type errors on offsetof element of uninstantiated generic type errors on undefined instance variable errors on undefined instance variable types offsetof types offsetof 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 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 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 can be used with generic types can be used with generic types 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 Normalize: def expands with named argument expands with named argument expands with one named arg that is the only one (2) expands with one named arg that is the only one (2) expands with more named arg which come in the correct order expands with more named arg which come in the correct order expands with splat with one arg before expands with splat with one arg before expands with magic constant specifying one when all are magic expands with magic constant specifying one when all are magic expands with named argument and yield expands with named argument and yield 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 not all are magic expands with magic constant specifying one when not all are magic expands a def with double splat and two named args expands a def with double splat and two named 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 two named argument and one not expands with two named argument and one not 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 a def on request with default arguments and type restrictions expands a def on request with default arguments and type restrictions expands arg with default value after splat expands arg with default value after splat expands with magic constant with named arg expands with magic constant with named arg expands a def with external names (1) expands a def with external names (1) expands a def with external names (2) expands a def with external names (2) expands with magic constant with named arg with yield expands with magic constant with named arg with yield expands with splat expands with splat expands def with reserved external name (#6559) expands def with reserved external name (#6559) expands with two named argument expands with two named argument expands a def on request with default arguments that yields expands a def on request with default arguments that yields expands a def with splat and double splat expands a def with splat and double splat expands default value after splat index expands default value after splat index expands with magic constant expands with magic constant 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 expands with one named arg that is the only one (1) expands with one named arg that is the only one (1) expands with splat and zero expands with splat and zero expands a def on request with default arguments expands a def on request with default arguments expands a def on request with default arguments that yields (2) expands a def on request with default arguments that yields (2) gives correct body location with splat arg, with body splat arg, with body default arg with restriction, without body default arg with restriction, without body block instance var arg, with body block instance var arg, with body default arg with restriction, with body default arg with restriction, with body default arg, with body default arg, with body splat arg, without body splat arg, without body block instance var arg, without body block instance var arg, without body default arg, without body default arg, without body expands with splat and default argument expands with splat and default argument 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 uses bare * uses bare * expands a def on request with default arguments (2) expands a def on request with default arguments (2) expands a def with double splat and no args expands a def with double splat and no args Lexer macro lexes macro with embedded string with %< ignores begin lexes macro with embedded string with %< ignores begin lexes macro with nested case lexes macro with nested case lexes macro with embedded char and sharp lexes macro with embedded char and sharp lexes macro with slash not followed by curly lexes macro with slash not followed by curly lexes macro with nested union lexes macro with nested union keeps correct column and line numbers keeps correct column and line numbers lexes begin end lexes begin end reaches end reaches end lexes macro with comments lexes macro with comments lexes macro with curly escape in comment lexes macro with curly escape in comment lexes with unless inside escaped macro (#5664) lexes with unless inside escaped macro (#5664) lexes macro with nested do lexes macro with nested do lexes macro with nested until lexes macro with nested until lexes macro with string interpolation and double curly brace lexes macro with string interpolation and double curly brace lexes macro with embedded string and expression lexes macro with embedded string and expression lexes with if/end inside escaped macro (#1029) lexes with if/end inside escaped macro (#1029) lexes macro with nested enum lexes macro with nested enum lexes macro var lexes macro var lexes macro with embedded string with %[ ignores begin lexes macro with embedded string with %[ ignores begin lexes macro with nested annotation lexes macro with nested annotation lexes macro with nested abstract class lexes macro with nested abstract class 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 nested macro lexes macro with nested macro lexes macro with semicolon before end lexes macro with semicolon before end skips whitespace skips whitespace lexes macro with nested class lexes macro with nested class lexes macro with nested lib lexes macro with nested lib lexes macro with if as suffix after return lexes macro with if as suffix after return lexes macro with nested begin lexes macro with nested begin lexes macro with embedded string and backslash lexes macro with embedded string and backslash lexes macro with nested select lexes macro with nested select lexes macro with nested module lexes macro with nested module lexes macro with nested fun lexes macro with nested fun lexes macro with nested struct lexes macro with nested struct lexes macro with embedded string with %( lexes macro with embedded string with %( lexes escaped quote inside string (#895) lexes escaped quote inside string (#895) lexes macro with embedded string lexes macro with embedded string lexes macro with nested if lexes macro with nested if lexes macro with nested def lexes macro with nested def lexes macro with control lexes macro with control doesn't lex macro var if escaped doesn't lex macro var if escaped lexes macro with curly escape lexes macro with curly escape lexes macro with nested abstract struct lexes macro with nested abstract struct lexes simple macro lexes simple macro lexes macro with if after assign lexes macro with if after assign lexes macro with nested abstract def lexes macro with nested abstract def lexes macro with if as suffix lexes macro with if as suffix lexes macro with nested embedded string with %( lexes macro with nested embedded string with %( lexes macro with nested unless lexes macro with nested unless lexes with for inside escaped macro (#1029) lexes with for inside escaped macro (#1029) lexes macro with expression lexes macro with expression lexes macro with comments and expressions lexes macro with comments and expressions lexes macro with embedded string with %[ lexes macro with embedded string with %[ lexes macro without nested if lexes macro without nested if lexes macro with nested while lexes macro with nested while lexes macro with embedded string with %( ignores begin lexes macro with embedded string with %( ignores begin lexes bug #654 lexes bug #654 lexes macro with embedded string with %< lexes macro with embedded string with %< Code gen: enum codegens enum None redefined codegens enum None redefined can define flags enum : UInt128 with 128 values can define flags enum : UInt128 with 128 values can use macro calls inside enum value, with receiver (#424) can use macro calls inside enum value, with receiver (#424) adds a none? method to flags enum adds a none? method to flags enum does ~ at compile time for enum member does ~ at compile time for enum member can redefine Enum.new and use previous_def can redefine Enum.new and use previous_def casts All value to base type casts All value to base type uses enum value before declaration (hoisting) uses enum value before declaration (hoisting) automatically defines question method for each enum member (false case) automatically defines question method for each enum member (false case) codegens enum All redefined codegens enum All redefined can define flags enum : UInt64 with more than 32 values (#7268) can define flags enum : UInt64 with more than 32 values (#7268) codegens enum bitflags (2) codegens enum bitflags (2) can use macro calls inside enum value (#424) can use macro calls inside enum value (#424) codegens enum bitflags None codegens enum bitflags None codegens enum without explicit value codegens enum without explicit value can define flags enum : UInt128 with compile-time interpreted values can define flags enum : UInt128 with compile-time interpreted values automatically defines question method for each enum member (flags, false case) automatically defines question method for each enum member (flags, false case) codegens enum bitflags (1) codegens enum bitflags (1) creates enum from value creates enum from value codegens enum bitflags (4) codegens enum bitflags (4) can use macro calls inside enum value, macro defined outside enum (#424) can use macro calls inside enum value, macro defined outside enum (#424) codegens enum codegens enum allows class vars in enum allows class vars in enum automatically defines question method for each enum member (true case) automatically defines question method for each enum member (true case) codegens enum value codegens enum value automatically defines question method for each enum member (flags, true case) automatically defines question method for each enum member (flags, true case) codegens enum bitflags All codegens enum bitflags All Normalize: chained comparisons normalizes one comparison with literal normalizes one comparison with literal normalizes one comparison with var normalizes one comparison with var normalizes two comparisons with literal normalizes two comparisons with literal normalizes two comparisons with calls normalizes two comparisons with calls normalizes one comparison with call normalizes one comparison with call Code gen: uninitialized works with uninitialized NoReturn (#3314) works with uninitialized NoReturn (#3314) codegens declare var and read it codegens declare var and read it codegens value (#3641) codegens value (#3641) doesn't break on inherited declared var (#390) doesn't break on inherited declared var (#390) codegens declare var and changes it codegens declare var and changes it works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) works inside while/begin/rescue (bug inside #759) codegens declare instance var with static array type codegens declare instance var with static array type codegens declare instance var codegens declare instance var Semantic: var errors if declaring generic type without type vars (with local var) errors if declaring generic type without type vars (with local var) reports undefined local variable or method reports undefined local variable or method declares local variable and assigns it with if declares local variable and assigns it with if declares local variable and assigns wrong type declares local variable and assigns wrong type declares local variable and immediately reads it declares local variable and immediately reads it errors if variable already exists errors if variable already exists errors if reads from underscore errors if reads from underscore declares local variable but doesn't assign it in all branches declares local variable but doesn't assign it in all branches reports variable always nil reports variable always nil types a variable types a variable declares local variable and then assigns it declares local variable and then assigns it declares local variable with value declares local variable with value lets type on else side of if with a Bool | Nil union lets type on else side of if with a Bool | Nil union types an assign with type declaration types an assign with type declaration reports there's no self reports there's no self errors if declaring var that is already declared errors if declaring var that is already declared parse local variable as method call even if local variable is declared in call arguments parse local variable as method call even if local variable is declared in call arguments types an assign types an assign Crystal::TablePrint rows with horizontal separators rows with horizontal separators aligns cell content aligns cell content single cell single cell colspan a cell that fits the available size colspan a cell that fits the available size single row with separator single row with separator aligns columns borders aligns columns borders multiple rows with separator multiple rows with separator Code gen: nilable cast does nilable cast (always true) does nilable cast (always true) does nilable cast (false) does nilable cast (false) does upcast does upcast casts union type to nilable type (#9342) casts union type to nilable type (#9342) upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) does cast to nil (2) does cast to nil (2) does cast to nil (1) does cast to nil (1) casts with block var that changes type (#3341) casts with block var that changes type (#3341) upcasts type to virtual (#3304) upcasts type to virtual (#3304) types as? with wrong type (#2775) types as? with wrong type (#2775) codegens with NoReturn codegens with NoReturn does nilable cast (true) does nilable cast (true) Semantic: exception can use break inside while inside ensure (#4470) can use break inside while inside ensure (#4470) can't use next inside while inside ensure (#4470) can't use next inside while inside ensure (#4470) type for exception handler for explicit types type for exception handler for explicit types can't return from ensure (#4470) can't return from ensure (#4470) 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) marks proc literal as raises marks proc literal as raises types exception with type types exception with type 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) 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) doesn't infect type to variable before handler (#4002) doesn't infect type to variable before handler (#4002) correctly types variable assigned inside nested exception handler (#9769) correctly types variable assigned inside nested exception handler (#9769) marks method calling method that raises as raises marks method calling method that raises as raises doesn't crash on break inside rescue, in while (#2441) doesn't crash on break inside rescue, in while (#2441) types a var after rescue as being nilable types a var after rescue as being nilable types var as nilable inside ensure (2) types var as nilable inside ensure (2) 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) remains nilable after rescue remains nilable after rescue marks fun as raises marks fun as raises 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 errors if caught exception is not a subclass of Exception errors if caught exception is not a subclass of Exception can't use break inside block inside ensure (#4470) can't use break inside block inside ensure (#4470) marks def as raises marks def as raises can use next inside block inside ensure (#4470) can use next inside block inside ensure (#4470) types var as nilable if previously nilable (2) types var as nilable if previously nilable (2) can't return from block inside ensure (#4470) can't return from block inside ensure (#4470) transform nodes in else block transform nodes in else block says syntax error on "begin; rescue ex; rescue; end; ex" says syntax error on "begin; rescue ex; rescue; end; ex" gets a non-nilable type if all rescue are unreachable (#8751) gets a non-nilable type if all rescue are unreachable (#8751) can't return from while inside ensure (#4470) can't return from while inside ensure (#4470) types a var after begin rescue with no-return in rescue types a var after begin rescue with no-return in rescue can't use next inside block inside ensure (#4470) can't use next inside block inside ensure (#4470) can use break inside block inside ensure (#4470) can use break inside block inside ensure (#4470) marks method calling lib fun that raises as raises marks method calling lib fun that raises as raises 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) type union with empty rescue block type union with empty rescue block can use next inside while inside ensure (#4470) can use next inside while inside ensure (#4470) type is union of main and rescue blocks type is union of main and rescue blocks assigns var inside ensure (1) (#3919) assigns var inside ensure (1) (#3919) types var as nilable inside ensure (1) types var as nilable inside ensure (1) can't use break inside while inside ensure (#4470) can't use break inside while inside ensure (#4470) types instance variable as nilable if assigned inside an exception handler (#1845) types instance variable as nilable if assigned inside an exception handler (#1845) marks instance variable as nilable if assigned inside rescue inside initialize marks instance variable as nilable if assigned inside rescue inside initialize says syntax error on "begin; else; 1; end" says syntax error on "begin; else; 1; end" type union with empty main block type union with empty main block errors if caught exception is a nested union but not all types are valid errors if caught exception is a nested union but not all types are valid 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 correctly types #1988 correctly types #1988 types var as nilable if previously nilable (1) types var as nilable if previously nilable (1) marks method that calls another method that raises as raises, recursively marks method that calls another method that raises as raises, recursively errors if caught exception is a union but not all types are valid errors if caught exception is a union but not all types are valid types var assignment inside block inside exception handler (#3324) types var assignment inside block inside exception handler (#3324) shadows local variable (1) shadows local variable (1) types code with abstract exception that delegates method types code with abstract exception that delegates method errors if caught exception is not a subclass of Exception without var errors if caught exception is not a subclass of Exception without var types exception var with no types types exception var with no types 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 Semantic: def overload dispatch call to def with restrictions dispatch call to def with restrictions doesn't match with wrong number of type arguments (#313) doesn't match with wrong number of type arguments (#313) types a call with overload selecting the most restrictive types a call with overload selecting the most restrictive matches a union argument with free var, more types (1) matches a union argument with free var, more types (1) restrict virtual type with virtual type restrict virtual type with virtual type matches a generic module argument matches a generic module argument overloads on metaclass (2) (#2916) overloads on metaclass (2) (#2916) matches generic class instance type with another one matches generic class instance type with another one matches a union argument with free var, more types (2) matches a union argument with free var, more types (2) types a call with overload self with inherited type types a call with overload self with inherited type gives better error message with consecutive arguments sizes gives better error message with consecutive arguments sizes finds method after including module in generic module (#1201) finds method after including module in generic module (#1201) matches a generic module argument with free var (2) matches a generic module argument with free var (2) matches a generic module argument with free var matches a generic module argument with free var gives correct error message, looking up parent defs, when no overload matches gives correct error message, looking up parent defs, when no overload matches filter union type with virtual filter union type with virtual restrict matches to minimum necessary 1 restrict matches to minimum necessary 1 reports no overload matches with correct method owner (#2083) reports no overload matches with correct method owner (#2083) types a call with overload type second overload types a call with overload type second overload 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 errors when binding free variable to different types errors when binding free variable to different types types a call with overload self in included module types a call with overload self in included module matches tuples and uses free var matches tuples and uses free var types a call with overload matches virtual types a call with overload matches virtual can call overload with generic restriction can call overload with generic restriction gets free variable from union restriction (2) gets free variable from union restriction (2) overloads with named argument (#4465) overloads with named argument (#4465) types a call with overload self other match types a call with overload self other match gets free variable from union restriction gets free variable from union restriction types a call with overload selecting the most restrictive 2 types a call with overload selecting the most restrictive 2 errors when binding free variable to different types (2) errors when binding free variable to different types (2) overloads on metaclass (#2916) overloads on metaclass (#2916) restricts union to generic class restricts union to generic class errors if union restriction has multiple free vars errors if union restriction has multiple free vars matches tuples of different sizes matches tuples of different sizes resets free vars after a partial match is rejected (#10270) resets free vars after a partial match is rejected (#10270) restricts on generic type with free type arg restricts on generic type with free type arg doesn't crash on unknown metaclass doesn't crash on unknown metaclass restricts on generic type without type arg restricts on generic type without 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 does not consider global paths as free variables (1) does not consider global paths as free variables (1) accepts overload with nilable type restriction accepts overload with nilable type restriction considers NamedTuple in a module's including types (#10380) considers NamedTuple in a module's including types (#10380) does not consider global paths as free variables (2) does not consider global paths as free variables (2) includes splat symbol in error message includes splat symbol in error message types a call with overload matches virtual 3 types a call with overload matches virtual 3 types a call with overload self in included module other type types a call with overload self in included module other type types a call with overload self types a call with overload self compare self type with others compare self type with others prefers more specific overload than one with free variables prefers more specific overload than one with free variables types a call with overload type first overload types a call with overload type first overload matches types with free variables matches types with free variables lookup matches in virtual type inside union lookup matches in virtual type inside union types a call with overload Object type first overload types a call with overload Object type first overload matches virtual type to union matches virtual type to union matches tuple with underscore matches tuple with underscore compare_strictness positional parameters single splat restriction vs single splat with stricter restriction single splat restriction vs single splat with stricter restriction positional parameter with stricter restriction vs single splat with restriction positional parameter with stricter restriction vs single splat with restriction positional parameter with restriction vs single splat positional parameter with restriction vs single splat positional parameter vs single splat with restriction positional parameter vs single splat with restriction positional parameter with restriction vs single splat with stricter restriction positional parameter with restriction vs single splat with stricter restriction specificity specificity single splat vs single splat with restriction (#3134) single splat vs single splat with restriction (#3134) specificity conflicts, positional vs named (required > splat) vs (required > optional) (required > splat) vs (required > optional) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (optional > splat) vs (required > optional) (optional > splat) vs (required > optional) (required > optional) vs (required > splat) (required > optional) vs (required > splat) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (required > splat) (optional > splat) vs (required > splat) (required > splat) vs (required > splat) (required > splat) vs (required > splat) (required > optional) vs (required > optional) (required > optional) vs (required > optional) specificity conflicts, named vs named (required > splat) vs (required > splat) (required > splat) vs (required > splat) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (required > optional) vs (required > optional) (required > optional) vs (required > optional) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (required > optional) vs (required > splat) (required > optional) vs (required > splat) subsumption conflicts positional vs single splat positional vs single splat positional vs named positional vs named single splat vs double splat single splat vs double splat named vs double splat named vs double splat single splat vs named single splat vs named named vs named named vs named positional vs double splat positional vs double splat positional vs positional positional vs positional subsumption has higher precedence over specificity same positional parameter, required > optional same positional parameter, required > optional double splat vs (optional positional > single splat) double splat vs (optional positional > single splat) positional vs (required named > double splat) positional vs (required named > double splat) named vs (required named > optional named) named vs (required named > optional named) named vs (required positional > single splat) named vs (required positional > single splat) positional vs (required positional > single splat) positional vs (required positional > single splat) same named parameter, optional > double splat same named parameter, optional > double splat single splat vs (required named > optional named) single splat vs (required named > optional named) double splat vs (required positional > optional positional) double splat vs (required positional > optional positional) positional vs (optional positional > single splat) positional vs (optional positional > single splat) single splat vs (optional named > double splat) single splat vs (optional named > double splat) named vs (required positional > optional positional) named vs (required positional > optional positional) double splat vs (required positional > single splat) double splat vs (required positional > 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 (optional named > double splat) positional vs (optional named > double splat) positional vs (required named > optional named) positional vs (required named > optional named) same named parameter, required > double splat same named parameter, required > double splat named vs (optional positional > single splat) named vs (optional positional > single splat) single splat vs (required named > double splat) single splat vs (required named > double splat) same positional parameter, required > single splat same positional parameter, required > single splat named vs (required named > double splat) named vs (required named > double splat) same positional parameter, optional > single splat same positional parameter, optional > single splat named vs (optional named > double splat) named vs (optional named > double splat) named parameters named parameter with restriction vs double splat with stricter restriction named parameter with restriction vs double splat with stricter restriction double splat vs double splat with restriction double splat vs double splat with restriction specificity specificity 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 vs double splat with restriction named parameter vs double splat with restriction named parameter with restriction vs double splat (#5328) named parameter with restriction vs double splat (#5328) 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 2 types a call with overload matches virtual 2 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) doesn't match tuples of different sizes doesn't match tuples of different sizes overloads on metaclass (3) (#2916) overloads on metaclass (3) (#2916) treats single splats with same restriction as equivalent (#12579) treats single splats with same restriction as equivalent (#12579) errors if no overload matches on union against named arg (#2640) errors if no overload matches on union against named arg (#2640) resets free vars after a partial match is rejected (2) (#10185) resets free vars after a partial match is rejected (2) (#10185) errors if generic type doesn't match errors if generic type doesn't match dispatches with named arg dispatches with named arg can call overload with aliased generic restriction can call overload with aliased generic restriction matches a union argument with free var matches a union argument with free var overloads union against non-union (#2904) overloads union against non-union (#2904) matches a union metaclass argument with free var (#8071) matches a union metaclass argument with free var (#8071) types a call with overload with yield types a call with overload with yield 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) gets free variable from union restriction without a union gets free variable from union restriction without a union errors if union restriction has multiple free vars (2) errors if union restriction has multiple free vars (2) 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 on partial union matches on partial union treats single splats with same restriction as equivalent (2) (#12579) treats single splats with same restriction as equivalent (2) (#12579) dispatch call to def with restrictions dispatch call to def with restrictions types a call with overload types a call with overload single type restriction wins over union single type restriction wins over union Semantic: abstract def implementation is not inherited from supertype nongeneric module nongeneric module nongeneric class nongeneric class generic module generic module generic class generic class 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) double splat must match keyword argument type double splat must match keyword argument type errors if abstract method is not implemented by subclass (nested in module) errors if abstract method is not implemented by subclass (nested in module) doesn't error if implementation matches keyword argument doesn't error if implementation matches keyword argument errors if abstract method is not implemented by subclass of subclass errors if abstract method is not implemented by subclass of subclass 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 doesn't error if implementation have keyword arguments in different order doesn't error if implementation have keyword arguments in different order doesn't error if implements with generic included module instance doesn't error if implements with generic included module instance works on abstract method on abstract class works on abstract method on abstract class implements through extend (considers original type for generic lookup) (#8096) implements through extend (considers original type for generic lookup) (#8096) errors if implementation doesn't have default value errors if implementation doesn't have default value 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 doesn't error if abstract method with args is implemented by subclass doesn't error if abstract method with args is implemented by subclass doesn't error if abstract method is implemented by subclass doesn't error if abstract method is implemented by subclass errors if implementation has more keyword arguments errors if implementation has more keyword arguments extra keyword arguments must have compatible type to double splat extra keyword arguments must have compatible type to double splat errors if implementation doesn't match splat type errors if implementation doesn't match splat type doesn't error if implements a NoReturn param doesn't error if implements a NoReturn param errors if implementation doesn't match keyword argument type errors if implementation doesn't match keyword argument type 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 implements through extend (considers original type for generic lookup) (2) (#8096) implements through extend (considers original type for generic lookup) (2) (#8096) matches generic types matches generic types errors if can't find child return type errors if can't find child return type error shows full signature of block parameter error shows full signature of block parameter doesn't error if implements with parent module doesn't error if implements with parent module doesn't error if implementation has more keyword arguments with default values doesn't error if implementation has more keyword arguments with default values allow double splat argument allow double splat argument errors if missing return type errors if missing return type errors if implementation doesn't have the same default value errors if implementation doesn't have the same default value errors if can't find parent return type errors if can't find parent return type doesn't error if implementation have default value doesn't error if implementation have default value 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) allow double splat when abstract doesn't have it allow double splat when abstract doesn't have it errors if missing a return type in subclass of generic subclass errors if missing a return type in subclass of generic subclass allow splat instead of keyword argument allow splat instead of keyword argument errors if using abstract def on metaclass errors if using abstract def on metaclass 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 abstract method is not implemented by including class errors if abstract method is not implemented by including class errors if abstract method with arguments is not implemented by subclass errors if abstract method with arguments is not implemented by subclass doesn't error if abstract method is not implemented by including module doesn't error if abstract method is not implemented by including module works on abstract def on sub-subclass works on abstract def on sub-subclass matches instantiated generic types matches instantiated generic types 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) doesn't error if implements with generic parent class instance doesn't error if implements with generic parent class instance 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 and args with default value doesn't error with splat and args with default value doesn't error with splat doesn't error with splat 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) can implement even if yield comes later in macro code can implement even if yield comes later in macro code errors if implementation doesn't have keyword arguments errors if implementation doesn't have keyword arguments errors if abstract method is not implemented by subclass errors if abstract method is not implemented by subclass errors if different return type errors if different return type 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 matches generic module (a bit more complex) matches generic module (a bit more complex) matches instantiated generic module matches instantiated generic module finds implements in included module in disorder (#4052) finds implements in included module in disorder (#4052) matches generic return type matches generic return type 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) matches generic module matches generic module errors if double splat type doesn't match errors if double splat type doesn't match doesn't error if implements with included module doesn't error if implements with included module errors if implementation adds type restriction errors if implementation adds type restriction errors if implementation misses the double splat errors if implementation misses the double splat errors if using abstract def on non-abstract class errors if using abstract def on non-abstract class errors if keyword argument doesn't have the same default value errors if keyword argument doesn't have the same default value can return a more specific type can return a more specific type errors if implementation doesn't have a splat errors if implementation doesn't have a splat 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) errors if using abstract def on subclass errors if using abstract def on subclass doesn't error if implements with parent class doesn't error if implements with parent class 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) allows arguments to be collapsed into splat allows arguments to be collapsed into splat 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 (don't check subclasses) doesn't error if abstract method with args is implemented by subclass (don't check subclasses) Parser parses "(bar {})" parses "(bar {})" parses "class Foo; end\nwhile true; end" parses "class Foo; end\nwhile true; end" says syntax error on "def foo(until); end" says syntax error on "def foo(until); end" parses "def =~(); end;" parses "def =~(); end;" parses "Foo({String, ->, ->})" parses "Foo({String, ->, ->})" parses "select\nwhen foo\n2\nelse\n3\nend" parses "select\nwhen foo\n2\nelse\n3\nend" parses "Foo(T, U, 1)" parses "Foo(T, U, 1)" says syntax error on "def foo(next); end" says syntax error on "def foo(next); end" parses "Foo(typeof(1))" parses "Foo(typeof(1))" parses "n =~ 2" parses "n =~ 2" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "foo.%(1, 2)" parses "foo.%(1, 2)" parses "def foo(until foo); end" parses "def foo(until foo); end" parses "foo [1]" parses "foo [1]" parses "foo.% do end" parses "foo.% do end" parses "def foo(macro foo); end" parses "def foo(macro foo); end" parses "def foo; a = 1; a; end" parses "def foo; a = 1; a; end" parses "def self.&; end;" parses "def self.&; 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 "macro <;end" parses "macro <;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 "def foo(@@yield); end" parses "def foo(@@yield); end" parses "->(x : Int32) : Int32 { }" parses "->(x : Int32) : Int32 { }" parses "puts ::foo" parses "puts ::foo" says syntax error on "b, 1 == 2, a = 4" says syntax error on "b, 1 == 2, a = 4" says syntax error on "break &* 1" says syntax error on "break &* 1" says syntax error on "def foo(fun); end" says syntax error on "def foo(fun); end" parses "foo -1.0, -2.0" parses "foo -1.0, -2.0" parses "foo = 1; ->foo.<(Int32)" parses "foo = 1; ->foo.<(Int32)" parses "foo(a: n == 2)" parses "foo(a: n == 2)" parses "foo.+ 1, 2" parses "foo.+ 1, 2" parses "foo &->bar" parses "foo &->bar" parses "foo(0, n | 2)" parses "foo(0, n | 2)" parses "def foo(x @@abstract); end" parses "def foo(x @@abstract); end" parses "foo &./(1)" parses "foo &./(1)" parses "/foo/x" parses "/foo/x" says syntax error on "foo { |self| }" says syntax error on "foo { |self| }" says syntax error on "return &- 1" says syntax error on "return &- 1" says syntax error on "case return; when 1; end; end" says syntax error on "case return; when 1; end; end" parses "next 1, *2" parses "next 1, *2" parses "a = 1; a[2] &&= 3" parses "a = 1; a[2] &&= 3" parses "def foo(x, *, y, &); 1; end" parses "def foo(x, *, y, &); 1; end" parses "property require : Int32" parses "property require : Int32" parses "def foo(sizeof foo); end" parses "def foo(sizeof foo); end" parses "foo(x: result : Int32); result" parses "foo(x: result : Int32); result" parses "def : Int32" parses "def : Int32" parses "{a: 1}" parses "{a: 1}" parses "->foo?" parses "->foo?" 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 )" says syntax error on "def foo(foo case); end" says syntax error on "def foo(foo case); end" parses ":/" parses ":/" says syntax error on "foo { |return| }" says syntax error on "foo { |return| }" parses "begin\n1\nensure\n2\nend" parses "begin\n1\nensure\n2\nend" parses "_, _ = 1, 2" parses "_, _ = 1, 2" parses "1 ensure 2" parses "1 ensure 2" says syntax error on "next >= 1" says syntax error on "next >= 1" parses "def foo(a, @[Foo] &block); end" parses "def foo(a, @[Foo] &block); end" says syntax error on "Foo(\"\": T)" says syntax error on "Foo(\"\": T)" parses "def foo(x @break); end" parses "def foo(x @break); end" parses "def self.>(); end;" parses "def self.>(); end;" parses "a = 1; a <<=\n1" parses "a = 1; a <<=\n1" parses "def foo; yield(1); end" parses "def foo; yield(1); end" parses "1+0" parses "1+0" says syntax error on "x : String, a = 4" says syntax error on "x : String, a = 4" parses "def foo(@class); end" parses "def foo(@class); end" parses "foo !false" parses "foo !false" says syntax error on "@foo :: Foo" says syntax error on "@foo :: Foo" parses "def ^(); end;" parses "def ^(); end;" parses "def foo; a = 1; a {}; end" parses "def foo; a = 1; a {}; end" parses "Int[8, 4,]" parses "Int[8, 4,]" parses "my_def def foo\nloop do\nend\nend" parses "my_def def foo\nloop do\nend\nend" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "unless foo; 1; end" parses "unless foo; 1; end" parses "foo a: b(1) do\nend" parses "foo a: b(1) do\nend" parses "f.x %= 2" parses "f.x %= 2" parses "Foo(*T)" parses "Foo(*T)" parses "foo = 1; ->foo.=~(Int32)" parses "foo = 1; ->foo.=~(Int32)" parses "Foo(Bar())" parses "Foo(Bar())" parses "def foo(var : Int -> Double); end" parses "def foo(var : Int -> Double); end" parses "case {1}\nin {false}; 2; end" parses "case {1}\nin {false}; 2; end" says syntax error on "def foo var\n end" says syntax error on "def foo var\n end" parses "asm(\"nop\" : \"a\"(0))" parses "asm(\"nop\" : \"a\"(0))" parses "foo(0, n &+ 2)" parses "foo(0, n &+ 2)" parses "def foo(x = 1, **args)\n1\nend" parses "def foo(x = 1, **args)\n1\nend" says syntax error on "{a: 1, a: 2}" says syntax error on "{a: 1, a: 2}" parses "abstract class Foo; end" parses "abstract class Foo; end" says syntax error on "foo { |unless| }" says syntax error on "foo { |unless| }" says syntax error on "def foo(foo until); end" says syntax error on "def foo(foo until); end" parses "break : Int32" parses "break : Int32" says syntax error on "def foo *y; 1; end" says syntax error on "def foo *y; 1; end" says syntax error on "case 1\nin .nil?; 2" says syntax error on "case 1\nin .nil?; 2" parses "foo(n ^ 2)" parses "foo(n ^ 2)" parses "1.as(\n Int32\n)" parses "1.as(\n Int32\n)" parses "<<-HERE\n One\n Zero\n HERE" parses "<<-HERE\n One\n Zero\n HERE" says syntax error on "foo { |(module)| }" says syntax error on "foo { |(module)| }" says syntax error on "class Foo; require \"bar\"; end" says syntax error on "class Foo; require \"bar\"; end" parses "def <=(*args, **opts, &); end" parses "def <=(*args, **opts, &); end" parses "\"hello \" \\\n \"world\"" parses "\"hello \" \\\n \"world\"" parses "foo.% 1, 2" parses "foo.% 1, 2" parses "foo.bar= *baz" parses "foo.bar= *baz" parses "def foo(@extend); end" parses "def foo(@extend); end" parses "foo(&.block)" parses "foo(&.block)" parses "call @foo.bar" parses "call @foo.bar" parses "a = 1; a &+=\n1" parses "a = 1; a &+=\n1" parses "T/1" parses "T/1" parses "macro <<;end" parses "macro <<;end" parses "->Foo.%(Int32)" parses "->Foo.%(Int32)" parses "def ===; end;" parses "def ===; end;" parses "def foo(false foo); end" parses "def foo(false foo); end" parses "foo.>(1, 2)" parses "foo.>(1, 2)" parses "1 rescue 2" parses "1 rescue 2" parses "1 / 2" parses "1 / 2" says syntax error on "yield return" says syntax error on "yield return" parses "x[+ 1]" parses "x[+ 1]" parses "foo(a: n ^ 2)" parses "foo(a: n ^ 2)" parses "macro foo; bar class: 1; end" parses "macro foo; bar class: 1; end" parses "def /(); end;" parses "def /(); end;" sets correct location of splat in multiple assignment sets correct location of splat in multiple assignment says syntax error on "break when true" says syntax error on "break when true" parses "f ->{ a do\n end\n }" parses "f ->{ a do\n end\n }" parses "lib LibC\n@[Bar]; end" parses "lib LibC\n@[Bar]; end" says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "->(x : Int32, x : Int32) {}" parses "foo.<(1, 2)" parses "foo.<(1, 2)" parses "1.responds_to?(\n :foo\n)" parses "1.responds_to?(\n :foo\n)" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "f.x &+= 2" parses "f.x &+= 2" parses "+1.0" parses "+1.0" parses "def foo(@true); end" parses "def foo(@true); end" parses "/ /" parses "/ /" 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" says syntax error on "def foo(self); end" says syntax error on "def foo(self); end" parses "foo.[]=(1, 2) { 3 }" parses "foo.[]=(1, 2) { 3 }" parses "macro ^;end" parses "macro ^;end" parses "foo &.block = 0" parses "foo &.block = 0" parses "case 1; when 1 then 2; else; 3; end" parses "case 1; when 1 then 2; else; 3; end" parses "1 == 2 == 3 == 4" parses "1 == 2 == 3 == 4" parses "a == / /" parses "a == / /" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "foo(a: 1, &block)" parses "foo(a: 1, &block)" parses "foo begin\nbar do\nend\nend" parses "foo begin\nbar do\nend\nend" says syntax error on "break .. 1" says syntax error on "break .. 1" parses "def foo(@@begin); end" parses "def foo(@@begin); end" says syntax error on "def foo(begin); end" says syntax error on "def foo(begin); end" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "return 1, *2" parses "return 1, *2" parses "Foo()" parses "Foo()" parses "begin; 1; rescue ex; 2; end; ex" parses "begin; 1; rescue ex; 2; end; ex" parses "yield foo do\nend" parses "yield foo do\nend" parses "def foo(x @@macro); end" parses "def foo(x @@macro); end" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" parses "foo(0, n =~ 2)" parses "foo(0, n =~ 2)" parses "->Foo.+(Int32)" parses "->Foo.+(Int32)" parses "foo(0, n << 2)" parses "foo(0, n << 2)" parses "def foo(var : Int, Float -> Double); end" parses "def foo(var : Int, Float -> Double); end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "@[Foo(1)]" parses "@[Foo(1)]" parses "next {1 => 2}" parses "next {1 => 2}" says syntax error on "foo { |(in)| }" says syntax error on "foo { |(in)| }" parses "foo(a: n !~ 2)" parses "foo(a: n !~ 2)" parses "{% begin %}%Q| %s |{% end %}" parses "{% begin %}%Q| %s |{% end %}" says syntax error on "-> :Int32 { }" says syntax error on "-> :Int32 { }" parses "foo(Bar { 1 })" parses "foo(Bar { 1 })" parses "macro <=;end" parses "macro <=;end" says syntax error on "def foo(var : Foo+); end" says syntax error on "def foo(var : Foo+); end" parses "@[Foo]" parses "@[Foo]" parses "property next : Int32" parses "property next : Int32" parses "def foo(@private); end" parses "def foo(@private); end" parses "->Foo.!~(Int32)" parses "->Foo.!~(Int32)" parses "def foo(x @fun); end" parses "def foo(x @fun); end" parses "foo(n &+ 2)" parses "foo(n &+ 2)" parses "foo(a: n * 2)" parses "foo(a: n * 2)" parses "property lib : Int32" parses "property lib : Int32" parses "def foo(&block : Int ->\n); end" parses "def foo(&block : Int ->\n); end" parses "foo.+(1, 2)" parses "foo.+(1, 2)" parses "def foo(var : Int32 = 1); end" parses "def foo(var : Int32 = 1); end" parses "-@@foo" parses "-@@foo" parses "def !=(*args, **opts, &); end" parses "def !=(*args, **opts, &); end" parses "false" parses "false" says syntax error on "*a if true" says syntax error on "*a if true" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "require : Int32" parses "require : Int32" parses "foo = 1; ->foo.==(Int32)" parses "foo = 1; ->foo.==(Int32)" parses "def ==; end;" parses "def ==; end;" parses "def &-(); end" parses "def &-(); end" parses "foo(0, n &** 2)" parses "foo(0, n &** 2)" says syntax error on "1 if return" says syntax error on "1 if return" says syntax error on "return // 1" says syntax error on "return // 1" says syntax error on "def foo; require \"bar\"; end" says syntax error on "def foo; require \"bar\"; end" parses "def self.|(); end;" parses "def self.|(); end;" parses "->Foo.-(Int32)" parses "->Foo.-(Int32)" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "foo(/a/)" parses "foo(/a/)" says syntax error on "1 2" says syntax error on "1 2" parses "1 * -2" parses "1 * -2" parses "/ /; / /" parses "/ /; / /" says syntax error on "a = return" says syntax error on "a = return" says syntax error on "{\n}" says syntax error on "{\n}" parses "foo(a: 1\n)" parses "foo(a: 1\n)" parses "foo.+(1, 2) { 3 }" parses "foo.+(1, 2) { 3 }" says syntax error on "break.foo" says syntax error on "break.foo" parses "property break : Int32" parses "property break : Int32" parses "\"\#{1\n}\"" parses "\"\#{1\n}\"" 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 "x = 1 ensure 2" parses "x = 1 ensure 2" parses "f.x ^= 2" parses "f.x ^= 2" parses "property false : Int32" parses "property false : Int32" parses "fun foo(x : Int32) : Int64\nx\nend" parses "fun foo(x : Int32) : Int64\nx\nend" parses "next : Int32" parses "next : Int32" parses "a = 1; a &-= 1" parses "a = 1; a &-= 1" parses "foo[\nfoo[\n1\n]\n]" parses "foo[\nfoo[\n1\n]\n]" says syntax error on "def foo(x, x); end" says syntax error on "def foo(x, x); end" parses "yield 1 if true" parses "yield 1 if true" parses "instance_alignof(X)" parses "instance_alignof(X)" parses "macro |;end" parses "macro |;end" parses "%r(\\/)" parses "%r(\\/)" 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" parses "->Foo.|(Int32)" parses "->Foo.|(Int32)" parses "x[{1}]" parses "x[{1}]" parses "def foo(x, *args, y = 2); 1; end" parses "def foo(x, *args, y = 2); 1; end" says syntax error on "def self.as?; end" says syntax error on "def self.as?; end" parses "foo(z: 0, a: n == 2)" parses "foo(z: 0, a: n == 2)" says syntax error on "a.b(), c.d = 1" says syntax error on "a.b(), c.d = 1" parses "def foo(@module); end" parses "def foo(@module); end" parses "def /; end;" parses "def /; end;" parses "1.as?(\n Int32\n)" parses "1.as?(\n Int32\n)" says syntax error on "if 1\n foo 1,\nend" says syntax error on "if 1\n foo 1,\nend" says syntax error on "->(x y) { }" says syntax error on "->(x y) { }" parses "if foo.responds_to? :foo\nx = 1\nend" parses "if foo.responds_to? :foo\nx = 1\nend" parses "case {1}\nin {Int32}; 2; end" parses "case {1}\nin {Int32}; 2; end" parses "def self.>=; end;" parses "def self.>=; end;" parses "macro //;end" parses "macro //;end" says syntax error on "while 1 == 1 a; end" says syntax error on "while 1 == 1 a; end" parses "{% begin %}%i| %s |{% end %}" parses "{% begin %}%i| %s |{% end %}" parses "extend Foo" parses "extend Foo" parses "require \"foo\"; [1]" parses "require \"foo\"; [1]" parses "def self./(); end;" parses "def self./(); end;" parses "rescue : Int32" parses "rescue : Int32" parses "a.b &-=\n1" parses "a.b &-=\n1" says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax error on "lib LibC\n$Errno : Int32\nend" parses "def foo(n); foo(n -1); end" parses "def foo(n); foo(n -1); end" parses "pointerof(@a)" parses "pointerof(@a)" says syntax error on "class Foo(*T, *U); end" says syntax error on "class Foo(*T, *U); end" parses "Foo(X, instance_alignof(Int32))" parses "Foo(X, instance_alignof(Int32))" parses "*a = 1, 2" parses "*a = 1, 2" parses "def foo(@instance_sizeof); end" parses "def foo(@instance_sizeof); end" parses "def self.==; end;" parses "def self.==; 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 "lib LibC; struct Foo; x : Int*; end end" parses "lib LibC; struct Foo; x : Int*; end end" parses "foo % i()" parses "foo % i()" parses "[\n1,2\n]" parses "[\n1,2\n]" parses "1 - 2" parses "1 - 2" parses "->foo(Void*)" parses "->foo(Void*)" 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 |= 1" parses "a = 1; a |= 1" parses "fun foo : Int32; 1; end; 2" parses "fun foo : Int32; 1; end; 2" parses "def foo(begin foo); end" parses "def foo(begin foo); end" says syntax error on "def foo\ninclude\nend" says syntax error on "def foo\ninclude\nend" parses "Int[8]?" parses "Int[8]?" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "enum Foo\n A, B, C\nend\n" says syntax error on "enum Foo\n A, B, C\nend\n" parses "def foo(a, &block : Int -> Double); end" parses "def foo(a, &block : Int -> Double); end" says syntax error on "foo { |next| }" says syntax error on "foo { |next| }" says syntax error on "case next; when 1; end; end" says syntax error on "case next; when 1; end; end" parses "(foo bar do\nend)" parses "(foo bar do\nend)" parses "foo.==(1, 2)" parses "foo.==(1, 2)" says syntax error on "case 1\nin _;" says syntax error on "case 1\nin _;" parses "Foo({\"foo bar\": X})" parses "Foo({\"foo bar\": X})" parses "Foo{\"x\" => \"y\"}" parses "Foo{\"x\" => \"y\"}" sets correct location of annotation in lib sets correct location of annotation in lib says syntax error on "{a: 1 b: 2}" says syntax error on "{a: 1 b: 2}" parses "def foo(x @macro); end" parses "def foo(x @macro); end" parses "def foo(@[Foo] outer inner); end" parses "def foo(@[Foo] outer inner); end" parses "foo.<(1, 2) { 3 }" parses "foo.<(1, 2) { 3 }" parses "a = 1; a <<= 1" parses "a = 1; a <<= 1" says syntax error on "def foo(*args = 1); end" says syntax error on "def foo(*args = 1); end" parses "*a, b = 1, 2, 3, 4" parses "*a, b = 1, 2, 3, 4" parses "macro foo=;end" parses "macro foo=;end" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "macro %;end" parses "macro %;end" parses "@[Foo::Bar]" parses "@[Foo::Bar]" parses "puts ~1" parses "puts ~1" parses "module Foo(T); end" parses "module Foo(T); end" parses "def foo(yield foo); end" parses "def foo(yield foo); end" parses "->foo!" parses "->foo!" parses "def self.<=(); end;" parses "def self.<=(); end;" parses "a.b -=\n1" parses "a.b -=\n1" parses "foo\n #comment\n .bar" parses "foo\n #comment\n .bar" parses "{% begin %}%q| %s |{% end %}" parses "{% begin %}%q| %s |{% end %}" says syntax error on "A = begin; B = 1; end" says syntax error on "A = begin; B = 1; end" parses "def foo(x @@nil); end" parses "def foo(x @@nil); end" parses "->Foo.<(Int32)" parses "->Foo.<(Int32)" parses "def foo(@macro); end" parses "def foo(@macro); end" parses "enum Foo; A\nB; C\nD = 1; end" parses "enum Foo; A\nB; C\nD = 1; end" says syntax error on "next &** 1" says syntax error on "next &** 1" parses "case 1; when x then 2; else; 3; end" parses "case 1; when x then 2; else; 3; end" parses "class : Int32" parses "class : Int32" parses "def foo(abstract foo); end" parses "def foo(abstract foo); end" says syntax error on "foo { |(require)| }" says syntax error on "foo { |(require)| }" parses "1\n-2" parses "1\n-2" parses "foo = 1; ->foo.**(Int32)" parses "foo = 1; ->foo.**(Int32)" parses "foo.bar = {} of Int32 => Int32" parses "foo.bar = {} of Int32 => Int32" parses "@@a : Foo" parses "@@a : Foo" says syntax error on "def foo(abstract); end" says syntax error on "def foo(abstract); end" parses "foo(1, a: 1, b: 2)" parses "foo(1, a: 1, b: 2)" parses "{% begin %}%w[ %s ]{% end %}" parses "{% begin %}%w[ %s ]{% end %}" parses "(a;\nb)" parses "(a;\nb)" parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "def foo(@[Foo] @[Bar] var : Int32); end" says syntax error on "enum Foo; A B; end" says syntax error on "enum Foo; A B; end" parses "[] of Int" parses "[] of Int" parses "f.x **= 2" parses "f.x **= 2" says syntax error on "foo { |include| }" says syntax error on "foo { |include| }" parses "def *(); end;" parses "def *(); end;" parses "foo(0, n % 2)" parses "foo(0, n % 2)" parses "pointerof : Int32" parses "pointerof : Int32" parses "{1 => 2 / 3}" parses "{1 => 2 / 3}" parses "/foo/i" parses "/foo/i" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "case {1}\nin {_}; 2; end" parses "case {1}\nin {_}; 2; end" parses "-1" parses "-1" parses "foo = 1; ->foo.bar(Int32)" parses "foo = 1; ->foo.bar(Int32)" parses "foo.[]=" parses "foo.[]=" says syntax error on "foo { |asm| }" says syntax error on "foo { |asm| }" parses "x[a: 1, b: 2,]" parses "x[a: 1, b: 2,]" parses "typeof(\n 1\n)" parses "typeof(\n 1\n)" says syntax error on "1 if next" says syntax error on "1 if next" parses "{%\nif 1; 2; end\n%}" parses "{%\nif 1; 2; end\n%}" parses "n >= 2" parses "n >= 2" parses "<<-HERE\nHERE" parses "<<-HERE\nHERE" parses "{a: 1, b: 2}" parses "{a: 1, b: 2}" parses "x = 1 rescue 2" parses "x = 1 rescue 2" parses "{% begin %}%x[ %s ]{% end %}" parses "{% begin %}%x[ %s ]{% end %}" parses "->() : Int32 do end" parses "->() : Int32 do end" parses "foo(&.as(T).bar)" parses "foo(&.as(T).bar)" 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" says syntax error on "1 unless return" says syntax error on "1 unless return" parses "def foo(x @@fun); end" parses "def foo(x @@fun); end" says syntax error on "break &- 1" says syntax error on "break &- 1" parses "if foo; 1; end" parses "if foo; 1; end" parses "while true; end\nif true; end" parses "while true; end\nif true; end" says syntax error on "def foo(\"\" y); y; end" says syntax error on "def foo(\"\" y); y; end" parses "foo.=~ do end" parses "foo.=~ do end" parses "foo &.nil?" parses "foo &.nil?" parses "class Foo(T, *U); end" parses "class Foo(T, *U); end" parses "{/ /, / /}" parses "{/ /, / /}" says syntax error on "def foo(**a foo); end" says syntax error on "def foo(**a foo); end" parses "macro foo;var if true;end" parses "macro foo;var if true;end" parses "a[], a[] = 1, 2" parses "a[], a[] = 1, 2" parses "macro []=;end" parses "macro []=;end" says syntax error on "return >> 1" says syntax error on "return >> 1" parses "foo %r" parses "foo %r" says syntax error on "A = foo { B = 1 }" says syntax error on "A = foo { B = 1 }" parses "foo(\n1\n)" parses "foo(\n1\n)" says syntax error on "next | 1" says syntax error on "next | 1" parses "def foo(@enum); end" parses "def foo(@enum); end" parses "def !=(); end;" parses "def !=(); end;" says syntax error on "next .. 1" says syntax error on "next .. 1" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "1 !~ 2" parses "1 !~ 2" says syntax error on "foo { |instance_sizeof| }" says syntax error on "foo { |instance_sizeof| }" parses "def foo=(value); end" parses "def foo=(value); end" parses "property elsif : Int32" parses "property elsif : Int32" says syntax error on "*a, 1 = 2" says syntax error on "*a, 1 = 2" parses "{{ nil?(foo) }}" parses "{{ nil?(foo) }}" says syntax error on "return | 1" says syntax error on "return | 1" parses "foo./(1, 2)" parses "foo./(1, 2)" parses "foo.==(1, 2) { 3 }" parses "foo.==(1, 2) { 3 }" parses "lib LibC; fun foo(a : Int**); end" parses "lib LibC; fun foo(a : Int**); end" parses "def foo(var : (Int, Float) -> Double); end" parses "def foo(var : (Int, Float) -> Double); end" parses "foo = 1; ->foo.<=(Int32)" parses "foo = 1; ->foo.<=(Int32)" says syntax error on "def foo(\"bar\");end" says syntax error on "def foo(\"bar\");end" parses "alignof(X)" parses "alignof(X)" parses "foo.!=(1, 2) { 3 }" parses "foo.!=(1, 2) { 3 }" says syntax error on "def foo var; end" says syntax error on "def foo var; end" parses "case foo; end" parses "case foo; end" parses "Foo({x: X})" parses "Foo({x: X})" parses "def foo(enum foo); end" parses "def foo(enum foo); end" parses "macro `;end" parses "macro `;end" says syntax error on "def is_a?; end" says syntax error on "def is_a?; end" says syntax error on "def foo(foo asm); end" says syntax error on "def foo(foo asm); end" says syntax error on "def foo(foo alias); end" says syntax error on "def foo(foo alias); end" parses "def foo(x @return); end" parses "def foo(x @return); end" parses "def foo(@nil); end" parses "def foo(@nil); end" parses "->foo(Int32, Float64)" parses "->foo(Int32, Float64)" parses "foo %q()" parses "foo %q()" says syntax error on "alias Foo?" says syntax error on "alias Foo?" says syntax error on "foo { |with| }" says syntax error on "foo { |with| }" parses "foo.** 1, 2" parses "foo.** 1, 2" says syntax error on "*a, *b = 1" says syntax error on "*a, *b = 1" parses "lib LibC; type A = B**; end" parses "lib LibC; type A = B**; end" sets correct location of global path in annotation sets correct location of global path in annotation 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" says syntax error on "def foo\nclass\nend" says syntax error on "def foo\nclass\nend" parses "->Foo.//(Int32)" parses "->Foo.//(Int32)" parses "def foo(@[Foo] *args); end" parses "def foo(@[Foo] *args); end" parses "def foo(x @@lib); end" parses "def foo(x @@lib); end" parses "next if true" parses "next if true" parses "->@foo.foo" parses "->@foo.foo" parses "instance_alignof(\n Int32\n)" parses "instance_alignof(\n Int32\n)" parses "foo = 1; ->foo.&-(Int32)" parses "foo = 1; ->foo.&-(Int32)" parses "macro -;end" parses "macro -;end" parses "Foo(T)" parses "Foo(T)" parses "a = 1\nfoo - a" parses "a = 1\nfoo - a" parses "foo &.block" parses "foo &.block" parses "return *1" parses "return *1" says syntax error on "foo { |until| }" says syntax error on "foo { |until| }" parses "def foo(x @@break); end" parses "def foo(x @@break); end" parses "def foo(@offsetof); end" parses "def foo(@offsetof); end" parses "::A::B" parses "::A::B" parses "foo.^(1, 2) { 3 }" parses "foo.^(1, 2) { 3 }" says syntax error on "def foo=(a = 1, b = 2); end" says syntax error on "def foo=(a = 1, b = 2); end" parses ":&" parses ":&" says syntax error on "foo { |yield| }" says syntax error on "foo { |yield| }" parses "self" parses "self" parses "a.foo(&block)" parses "a.foo(&block)" parses "foo.===" parses "foo.===" parses "def foo(def foo); end" parses "def foo(def foo); end" parses "def foo(x @next); end" parses "def foo(x @next); end" parses "1 >= 2" parses "1 >= 2" parses "@foo/2" parses "@foo/2" parses "foo(1.., 2)" parses "foo(1.., 2)" parses "foo % Q()" parses "foo % Q()" says syntax error on "macro foo(x, *); 1; end" says syntax error on "macro foo(x, *); 1; end" parses "foo(n % 2)" parses "foo(n % 2)" parses "foo.!~(1, 2)" parses "foo.!~(1, 2)" says syntax error on "def foo(foo end); end" says syntax error on "def foo(foo end); end" parses "foo(&.!)" parses "foo(&.!)" parses "foo.* do end" parses "foo.* do end" parses "def self.%(); end;" parses "def self.%(); end;" says syntax error on "foo { |(a b)| }" says syntax error on "foo { |(a b)| }" parses "def foo(@false); end" parses "def foo(@false); end" parses "foo(Foo: 1, Bar: 2)" parses "foo(Foo: 1, Bar: 2)" parses "foo ensure 2" parses "foo ensure 2" parses "foo.>= 1, 2" parses "foo.>= 1, 2" says syntax error on "foo(break)" says syntax error on "foo(break)" parses "def self.-(); end;" parses "def self.-(); end;" says syntax error on "break >= 1" says syntax error on "break >= 1" 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 "def foo\nmodule\nend" says syntax error on "def foo\nmodule\nend" parses "Foo(_)" parses "Foo(_)" parses "->@@foo.foo=" parses "->@@foo.foo=" parses "{% if 1\n x\nend %}" parses "{% if 1\n x\nend %}" parses "begin 1 end / 2" parses "begin 1 end / 2" says syntax error on "def foo(foo def); end" says syntax error on "def foo(foo def); end" says syntax error on "macro is_a?; end" says syntax error on "macro is_a?; end" parses "break" parses "break" parses "1..;" parses "1..;" parses "foo = 1; foo a: 1" parses "foo = 1; foo a: 1" parses "1..\n2.." parses "1..\n2.." says syntax error on "def foo(foo unless); end" says syntax error on "def foo(foo unless); end" parses "protected : Int32" parses "protected : Int32" parses "case \nwhen 1\n2\nend" parses "case \nwhen 1\n2\nend" parses "foo = 1; ->foo.&**(Int32)" parses "foo = 1; ->foo.&**(Int32)" parses "{% begin %}%i{ %s }{% end %}" parses "{% begin %}%i{ %s }{% end %}" says syntax error on "break > 1" says syntax error on "break > 1" parses "def foo(in foo); end" parses "def foo(in foo); end" parses "case {1}\nin {true}; 2; end" parses "case {1}\nin {true}; 2; end" says syntax error on "def foo(x = 1, y); end" says syntax error on "def foo(x = 1, y); end" parses "def foo(x @@while); end" parses "def foo(x @@while); end" parses "foo(//)" parses "foo(//)" parses "x = 1; foo x { }" parses "x = 1; foo x { }" parses "def foo(var : Char[N]); end" parses "def foo(var : Char[N]); end" parses "foo = 1; ->foo.&(Int32)" parses "foo = 1; ->foo.&(Int32)" says syntax error on "x++" says syntax error on "x++" says syntax error on "def foo(def); end" says syntax error on "def foo(def); end" 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 "Set() {1, 2, 3}" parses "Set() {1, 2, 3}" says syntax error on "def foo(x, **x); end" says syntax error on "def foo(x, **x); end" parses "foo /a/" parses "foo /a/" says syntax error on "foo { |(return)| }" says syntax error on "foo { |(return)| }" parses "->Foo.=~(Int32)" parses "->Foo.=~(Int32)" parses "def foo(@@fun); end" parses "def foo(@@fun); end" parses "Foo::Bar?" parses "Foo::Bar?" says syntax error on "def foo(_ y); y; end" says syntax error on "def foo(_ y); y; end" parses "foo.< do end" parses "foo.< do end" parses "foo./ 1, 2" parses "foo./ 1, 2" parses "true : Int32" parses "true : Int32" parses "a = 1; yield a ensure a" parses "a = 1; yield a ensure a" says syntax error on "break << 1" says syntax error on "break << 1" parses "::T/1" parses "::T/1" says syntax error on "class Foo(T U)" says syntax error on "class Foo(T U)" says syntax error on "def foo(foo lib); end" says syntax error on "def foo(foo lib); end" 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 "lib LibC\n$errno : B, C -> D\nend" parses "lib LibC\n$errno : B, C -> D\nend" says syntax error on "asm(\"\" ::: \"\"(var))" says syntax error on "asm(\"\" ::: \"\"(var))" parses "lib LibC\n$errno = Foo : Int32\nend" parses "lib LibC\n$errno = Foo : Int32\nend" parses "foo.!=" parses "foo.!=" parses "lib LibC\nfun getch = GetChar\nend" parses "lib LibC\nfun getch = GetChar\nend" parses "def foo(x = 1, *y); 1; end" parses "def foo(x = 1, *y); 1; end" parses ":^" parses ":^" says syntax error on "def foo(end); end" says syntax error on "def foo(end); end" parses "def foo(x, *, y); 1; end" parses "def foo(x, *, y); 1; end" parses "f.x *= 2" parses "f.x *= 2" says syntax error on "def foo(include); end" says syntax error on "def foo(include); end" says syntax error on "foo { |(nil)| }" says syntax error on "foo { |(nil)| }" parses "def foo(x @@require); end" parses "def foo(x @@require); end" says syntax error on "def foo(x: Int32); end" says syntax error on "def foo(x: Int32); end" parses "Foo(\nT\n)" parses "Foo(\nT\n)" says syntax error on "def foo(x : U) forall; end" says syntax error on "def foo(x : U) forall; end" parses "foo.*(1, 2)" parses "foo.*(1, 2)" parses "1 -2_i64" parses "1 -2_i64" parses "macro foo;if var;true;end;end" parses "macro foo;if var;true;end;end" parses ":[]" parses ":[]" says syntax error on "def foo(class); end" says syntax error on "def foo(class); end" parses "def self./; end;" parses "def self./; end;" parses "\"hello \\\n world\"" parses "\"hello \\\n world\"" parses "def downto(n)\n1\nend" parses "def downto(n)\n1\nend" parses "{% begin %}%q{ %s }{% end %}" parses "{% begin %}%q{ %s }{% end %}" parses "break *{1, 2}" parses "break *{1, 2}" parses "1 % 2" parses "1 % 2" parses "%q{hello \\n world}" parses "%q{hello \\n world}" parses ":<=" parses ":<=" parses "def foo(@@end); end" parses "def foo(@@end); end" parses "{{a = 1 if 2}}" parses "{{a = 1 if 2}}" parses "a ? 1\n : b" parses "a ? 1\n : b" parses "def &(); end" parses "def &(); end" says syntax error on "def foo\nstruct\nend" says syntax error on "def foo\nstruct\nend" parses "macro foo;unless var;true;end;end" parses "macro foo;unless var;true;end;end" parses "macro foo\n'\\\\'\nend" parses "macro foo\n'\\\\'\nend" parses "foo &.as(T).bar" parses "foo &.as(T).bar" parses "def &*(); end" parses "def &*(); end" parses "foo { |a| 1 }" parses "foo { |a| 1 }" parses "begin; 1; rescue Foo | Bar; 2; end" parses "begin; 1; rescue Foo | Bar; 2; end" parses "case 1\nin true; 2; end" parses "case 1\nin true; 2; 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 "foo[break]" says syntax error on "foo[break]" parses "foo a: 1, b: 2" parses "foo a: 1, b: 2" parses "def !~; end;" parses "def !~; end;" says syntax error on "return % 1" says syntax error on "return % 1" says syntax error on "macro Foo.bar;end" says syntax error on "macro Foo.bar;end" says syntax error on "foo { |module| }" says syntax error on "foo { |module| }" 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 "def self.=~(); end;" parses "def self.=~(); end;" says syntax error on "def foo\nabstract\nend" says syntax error on "def foo\nabstract\nend" says syntax error on "def foo(in); end" says syntax error on "def foo(in); end" says syntax error on "{a[]: 1}" says syntax error on "{a[]: 1}" parses "foo.<" parses "foo.<" parses "foo.== do end" parses "foo.== do end" says syntax error on "foo { |if| }" says syntax error on "foo { |if| }" parses "foo.-" parses "foo.-" says syntax error on "def foo(module); end" says syntax error on "def foo(module); end" parses "a : Foo | Int32" parses "a : Foo | Int32" parses "foo(z: 0, a: n ^ 2)" parses "foo(z: 0, a: n ^ 2)" parses "foo.<=(1, 2) { 3 }" parses "foo.<=(1, 2) { 3 }" parses "begin; 1; rescue ex; 2; end" parses "begin; 1; rescue ex; 2; end" says syntax error on "def foo(struct); end" says syntax error on "def foo(struct); end" parses "1 + 2" parses "1 + 2" says syntax error on "return < 1" says syntax error on "return < 1" parses "def self.===(); end;" parses "def self.===(); end;" says syntax error on "1 then" says syntax error on "1 then" says syntax error on "return > 1" says syntax error on "return > 1" parses "def ===(); end;" parses "def ===(); end;" parses "foo.^(1, 2)" parses "foo.^(1, 2)" parses "def foo(x @@case); end" parses "def foo(x @@case); end" parses "def **; end;" parses "def **; end;" parses "def foo(x) : Int32\n1\nend" parses "def foo(x) : Int32\n1\nend" parses "{1}" parses "{1}" says syntax error on "def foo(x :Int32); end" says syntax error on "def foo(x :Int32); end" parses "foo\n\n .bar" parses "foo\n\n .bar" says syntax error on "case 1 == 1; when 2 a; end" says syntax error on "case 1 == 1; when 2 a; end" parses "n > 2" parses "n > 2" parses "a, b = 1" parses "a, b = 1" parses "enum Foo; def foo; 1; end; end" parses "enum Foo; def foo; 1; end; end" parses "x = 1; ->{ x }" parses "x = 1; ->{ x }" says syntax error on "Foo{one: :two, three: :four}" says syntax error on "Foo{one: :two, three: :four}" says syntax error on "foo { |(asm)| }" says syntax error on "foo { |(asm)| }" says syntax error on "1 until 3" says syntax error on "1 until 3" parses "foo = 1; ->foo.|(Int32)" parses "foo = 1; ->foo.|(Int32)" parses "begin\n/ /\nend" parses "begin\n/ /\nend" parses "require \"foo\"" parses "require \"foo\"" parses "foo out x; x" parses "foo out x; x" parses "1 ... 2" parses "1 ... 2" says syntax error on "foo { |def| }" says syntax error on "foo { |def| }" 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 "foo { |(a, (b, (c, d)))| }" parses "foo { |(a, (b, (c, d)))| }" parses "property unless : Int32" parses "property unless : Int32" parses "def self.&(); end;" parses "def self.&(); end;" parses "foo(..2)" parses "foo(..2)" parses "def foo(x @@instance_sizeof); end" parses "def foo(x @@instance_sizeof); end" parses "a = 1; a >>= 1" parses "a = 1; a >>= 1" parses "{% begin %}%r[\\A]{% end %}" parses "{% begin %}%r[\\A]{% end %}" parses "foo./ do end" parses "foo./ do end" parses "n &** 2" parses "n &** 2" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" parses "macro : Int32" parses "macro : Int32" says syntax error on "a = 1; a += next" says syntax error on "a = 1; a += next" parses "def ~; end;" parses "def ~; end;" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "@[Foo(1, foo: 2\n)]" parses "@[Foo(1, foo: 2\n)]" parses "return;" parses "return;" parses "def =~(); end" parses "def =~(); end" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "def foo(x : *T -> R); end" parses "def foo(x : *T -> R); end" parses "foo.!=(1, 2)" parses "foo.!=(1, 2)" parses "%Q{hello \\n world}" parses "%Q{hello \\n world}" parses "end : Int32" parses "end : Int32" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "foo result : Int32; result" parses "foo result : Int32; result" parses "macro !~;end" parses "macro !~;end" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" says syntax error on "foo { |(instance_sizeof)| }" says syntax error on "foo { |(instance_sizeof)| }" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "1\\\n + 2" parses "1\\\n + 2" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" parses "case 1\nin .bar?; 2; end" parses "case 1\nin .bar?; 2; end" parses "def foo(if foo); end" parses "def foo(if foo); end" parses "1 \\\r\n + 2" parses "1 \\\r\n + 2" parses "->@foo.foo=" parses "->@foo.foo=" parses "\n\n__LINE__" parses "\n\n__LINE__" parses "asm(\"nop\" :::: \"volatile\")" parses "asm(\"nop\" :::: \"volatile\")" parses "case 1\nin Foo(Int32); 2; end" parses "case 1\nin Foo(Int32); 2; end" parses "a : Foo[12]" parses "a : Foo[12]" parses "+ 1" parses "+ 1" parses "/ /" parses "/ /" says syntax error on "foo { |(break)| }" says syntax error on "foo { |(break)| }" parses "begin; 1; rescue ::Foo; 2; end" parses "begin; 1; rescue ::Foo; 2; end" says syntax error on "\"\#{<<-HERE}\"\nHERE" says syntax error on "\"\#{<<-HERE}\"\nHERE" parses "1 == 2" parses "1 == 2" says syntax error on "def foo(**args, x); end" says syntax error on "def foo(**args, x); end" parses "def +(); end" parses "def +(); end" parses "def ~(); end;" parses "def ~(); end;" parses "n ** 2" parses "n ** 2" parses "foo = 1; ->foo.%(Int32)" parses "foo = 1; ->foo.%(Int32)" says syntax error on "1 as Bar" says syntax error on "1 as Bar" parses "foo(&.as?(T).bar)" parses "foo(&.as?(T).bar)" says syntax error on "def foo(**args = 1); end" says syntax error on "def foo(**args = 1); end" parses "foo(a: 1, b: 2)" parses "foo(a: 1, b: 2)" parses ":|" parses ":|" parses "def foo(x @@end); end" parses "def foo(x @@end); end" says syntax error on "foo(return)" says syntax error on "foo(return)" parses "foo(0, n !~ 2)" parses "foo(0, n !~ 2)" parses "r = 1; r.x += 2" parses "r = 1; r.x += 2" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "foo(x) do\n//\nend" parses "foo(x) do\n//\nend" parses "a.b >>=\n1" parses "a.b >>=\n1" parses "def foo(@@self); end" parses "def foo(@@self); end" says syntax error on "macro def foo : String; 1; end" says syntax error on "macro def foo : String; 1; end" parses "foo(0, n &- 2)" parses "foo(0, n &- 2)" parses "b.c ||= 1" parses "b.c ||= 1" says syntax error on "def foo(private); end" says syntax error on "def foo(private); end" parses "-> do; 1; rescue; 2; end" parses "-> do; 1; rescue; 2; end" parses "case 1; when 0, 1; 2; else; 3; end" parses "case 1; when 0, 1; 2; else; 3; end" parses "*_ = 1, 2" parses "*_ = 1, 2" parses "x = 2; foo do bar x end" parses "x = 2; foo do bar x end" parses "foo(n / 2)" parses "foo(n / 2)" parses "foo(out @x); @x" parses "foo(out @x); @x" parses "alias : Int32" parses "alias : Int32" parses "def foo(@yield); end" parses "def foo(@yield); end" parses "a : Foo()*" parses "a : Foo()*" parses "Foo({\"foo\": X, \"bar\": Y})" parses "Foo({\"foo\": X, \"bar\": Y})" parses "return : Int32" parses "return : Int32" parses "break {1, 2}" parses "break {1, 2}" parses "class Foo < Bar; end" parses "class Foo < Bar; end" parses "enum Foo; @@foo = 1\n A \n end" parses "enum Foo; @@foo = 1\n A \n end" parses "Foo({->})" parses "Foo({->})" parses "{1, 2, 3}" parses "{1, 2, 3}" says syntax error on "def foo=(*args); end" says syntax error on "def foo=(*args); end" parses "def foo(@begin); end" parses "def foo(@begin); end" parses "def foo(x : U) forall T, U; end" parses "def foo(x : U) forall T, U; end" says syntax error on "def foo(require); end" says syntax error on "def foo(require); end" parses "->::Foo.foo" parses "->::Foo.foo" says syntax error on "{\"\": 1}" says syntax error on "{\"\": 1}" parses "return 1" parses "return 1" parses "a = 1; a[2] ||= 3" parses "a = 1; a[2] ||= 3" parses "def foo; end; if false; 1; else; 2; end" parses "def foo; end; if false; 1; else; 2; end" parses "2.3_f32" parses "2.3_f32" parses "foo.&" parses "foo.&" parses "until true; 1; end;" parses "until true; 1; end;" says syntax error on "class Foo(); end" says syntax error on "class Foo(); end" says syntax error on "<<-'HERE\n" says syntax error on "<<-'HERE\n" parses "!a && b" parses "!a && b" says syntax error on "def foo(sizeof); end" says syntax error on "def foo(sizeof); end" parses "return if true" parses "return if true" says syntax error on "offsetof(X, 1.0)" says syntax error on "offsetof(X, 1.0)" parses "{% begin %}%q[ %s ]{% end %}" parses "{% begin %}%q[ %s ]{% end %}" parses "include Foo" parses "include Foo" says syntax error on "macro as; end" says syntax error on "macro as; end" parses "foo 1\n" parses "foo 1\n" parses "property with : Int32" parses "property with : Int32" says syntax error on "unless 1 == 1 a; end" says syntax error on "unless 1 == 1 a; end" parses "1.as(Bar)" parses "1.as(Bar)" parses "foo = 1; ->foo.foo!" parses "foo = 1; ->foo.foo!" parses "lib LibC; type A = B.class; end" parses "lib LibC; type A = B.class; end" parses "foo = 1; ->foo.!~(Int32)" parses "foo = 1; ->foo.!~(Int32)" parses "foo(Bar) { 1 }" parses "foo(Bar) { 1 }" parses ":~" parses ":~" parses "{% begin %}%w( %s ){% end %}" parses "{% begin %}%w( %s ){% end %}" parses "def foo(@select); end" parses "def foo(@select); end" parses "def foo(x @@in); end" parses "def foo(x @@in); end" says syntax error on "foo.||()" says syntax error on "foo.||()" parses "x : *T -> R" parses "x : *T -> R" parses "def foo(@def); end" parses "def foo(@def); end" parses "foo Bar { 1 }" parses "foo Bar { 1 }" parses "...2" parses "...2" parses "a.foo, *a.bar = 1" parses "a.foo, *a.bar = 1" parses "foo &.block(1)" parses "foo &.block(1)" parses "<<-FOO\n\t 1\n\t FOO" parses "<<-FOO\n\t 1\n\t FOO" says syntax error on "def foo(*x, &x); end" says syntax error on "def foo(*x, &x); end" parses "def ===(); end" parses "def ===(); end" parses "begin\n1\nend\nif true; end" parses "begin\n1\nend\nif true; 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" parses "->::foo?" parses "->::foo?" parses "@[Foo(1, foo: 2)]" parses "@[Foo(1, foo: 2)]" parses "foo.>=(1, 2)" parses "foo.>=(1, 2)" says syntax error on " {1 => end" says syntax error on " {1 => end" says syntax error on "def foo(alias); end" says syntax error on "def foo(alias); end" parses "def foo(\nvar); end" parses "def foo(\nvar); end" parses "nil?( )" parses "nil?( )" parses "foo[1] /2" parses "foo[1] /2" parses "def self.^(); end;" parses "def self.^(); end;" parses "def self./(); end;" parses "def self./(); end;" parses "->Foo.foo?" parses "->Foo.foo?" parses "1.=~(2)" parses "1.=~(2)" parses "Foo({x: X, typeof: Y})" parses "Foo({x: X, typeof: Y})" parses "{\"\".id}" parses "{\"\".id}" parses "foo.*" parses "foo.*" says syntax error on "$foo" says syntax error on "$foo" parses "foo %r()" parses "foo %r()" parses "1 !~ 2" parses "1 !~ 2" parses "def foo(include foo); end" parses "def foo(include foo); end" parses "return 1, 2" parses "return 1, 2" says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "case {1, 2}; when {3}; 4; end" parses "{% begin %}%q< %s >{% end %}" parses "{% begin %}%q< %s >{% end %}" parses "{% begin %}%w< %s >{% end %}" parses "{% begin %}%w< %s >{% end %}" parses "begin; 1; 2; 3; end;" parses "begin; 1; 2; 3; end;" parses "[] of ->\n" parses "[] of ->\n" parses "foo %Q()" parses "foo %Q()" 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 "def foo(@abstract); end" parses "def foo(@abstract); end" parses "def foo(a, &block : Int -> ); end" parses "def foo(a, &block : Int -> ); end" says syntax error on "{{ {{ 1 }} }}" says syntax error on "{{ {{ 1 }} }}" parses "lib LibC\nfun getchar\nend" parses "lib LibC\nfun getchar\nend" says syntax error on "break[0]" says syntax error on "break[0]" says syntax error on "macro !;end" says syntax error on "macro !;end" parses "foo = 1; foo(+1)" parses "foo = 1; foo(+1)" parses "with : Int32" parses "with : Int32" parses "def **(); end" parses "def **(); end" parses "return" parses "return" parses "def foo(x @private); end" parses "def foo(x @private); end" parses "macro &;end" parses "macro &;end" says syntax error on "def =\nend" says syntax error on "def =\nend" parses "foo out @x; @x" parses "foo out @x; @x" parses "def foo(true foo); end" parses "def foo(true foo); end" says syntax error on "case 1\nin Int32; 2; else" says syntax error on "case 1\nin Int32; 2; else" parses "def foo(@if); end" parses "def foo(@if); end" parses "def self.+; end;" parses "def self.+; end;" parses "macro foo(a, @[Foo] var);end" parses "macro foo(a, @[Foo] var);end" says syntax error on "def f end" says syntax error on "def f end" says syntax error on "1 unless break" says syntax error on "1 unless break" says syntax error on "false foo" says syntax error on "false foo" says syntax error on "case 1\nwhen Int32; 2; in 2" says syntax error on "case 1\nwhen Int32; 2; in 2" parses "lib LibC; type A = B; end" parses "lib LibC; type A = B; end" parses "def foo(var : Int | Double); end" parses "def foo(var : Int | Double); end" says syntax error on "def foo(foo pointerof); end" says syntax error on "def foo(foo pointerof); 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" parses "a.b() /3" parses "a.b() /3" parses "1 * 2" parses "1 * 2" parses "macro *;end" parses "macro *;end" parses "foo.===(1, 2)" parses "foo.===(1, 2)" parses "n < 2" parses "n < 2" parses "def foo(x @@protected); end" parses "def foo(x @@protected); end" parses "puts a if true" parses "puts a if true" parses "def foo(@@nil); end" parses "def foo(@@nil); end" parses "a.b &+=\n1" parses "a.b &+=\n1" parses "def foo(x @unless); end" parses "def foo(x @unless); end" says syntax error on "a = 1; a += break" says syntax error on "a = 1; a += break" says syntax error on "case 1\nin Int32; 2; when 2" says syntax error on "case 1\nin Int32; 2; when 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 "foo.bar = (1).abs" parses "foo.bar = (1).abs" parses "foo(z: 0, a: n =~ 2)" parses "foo(z: 0, a: n =~ 2)" parses "def foo(x @@if); end" parses "def foo(x @@if); end" parses "puts __LINE__" parses "puts __LINE__" parses "def foo(a, b = a); end" parses "def foo(a, b = a); end" parses "{} of Int => Double" parses "{} of Int => Double" parses ":\"\\\"foo\\\"\"" parses ":\"\\\"foo\\\"\"" parses "def %; end;" parses "def %; end;" says syntax error on "def foo(instance_sizeof); end" says syntax error on "def foo(instance_sizeof); end" says syntax error on "def foo :String\nend" says syntax error on "def foo :String\nend" parses "def foo(select foo); end" parses "def foo(select foo); end" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "1 +2" parses "1 +2" parses "foo = 1; ->foo.+(Int32)" parses "foo = 1; ->foo.+(Int32)" says syntax error on "break // 1" says syntax error on "break // 1" parses "def foo(@@def); end" parses "def foo(@@def); end" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" parses "return *1, 2" parses "return *1, 2" parses "def ==(*args, **opts, &); end" parses "def ==(*args, **opts, &); end" says syntax error on "fun foo(Int32); end" says syntax error on "fun foo(Int32); end" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "Hash {foo: 1} of Int32 => Int32" says syntax error on "Hash {foo: 1} of Int32 => Int32" says syntax error on "break ** 1" says syntax error on "break ** 1" sets correct location of private method in enum sets correct location of private method in enum parses "foo 1, a: 1, b: 2" parses "foo 1, a: 1, b: 2" parses "{% if 1; 2; end %}" parses "{% if 1; 2; end %}" parses "def /(); end" parses "def /(); end" says syntax error on "@:Foo" says syntax error on "@:Foo" parses "{A::B => 1, C::D => 2}" parses "{A::B => 1, C::D => 2}" says syntax error on "Hash{\"foo\": 1}" says syntax error on "Hash{\"foo\": 1}" parses "pointerof(@a)" parses "pointerof(@a)" parses "if foo; 1; else; 2; end" parses "if foo; 1; else; 2; end" parses "property until : Int32" parses "property until : Int32" parses "a.b *=\n1" parses "a.b *=\n1" parses "foo(n | 2)" parses "foo(n | 2)" parses "foo(0, n // 2)" parses "foo(0, n // 2)" parses "foo % r()" parses "foo % r()" says syntax error on "if 1 == 1 a; end" says syntax error on "if 1 == 1 a; end" parses "yield 1" parses "yield 1" parses "lib LibC\nend" parses "lib LibC\nend" parses "@@a : Foo = 1" parses "@@a : Foo = 1" parses "/\\//" parses "/\\//" parses "def !=; end;" parses "def !=; end;" parses "def foo(x @@private); end" parses "def foo(x @@private); end" parses "1 - 2" parses "1 - 2" parses "macro foo(\na = 0\n)\nend" parses "macro foo(\na = 0\n)\nend" parses "foo a: 1, &block" parses "foo a: 1, &block" says syntax error on "return + 1" says syntax error on "return + 1" says syntax error on "a {}, b = 1" says syntax error on "a {}, b = 1" parses "f.x >>= 2" parses "f.x >>= 2" parses "case when 1\n2\nend" parses "case when 1\n2\nend" says syntax error on "unless break; end" says syntax error on "unless break; end" parses "foo.** do end" parses "foo.** do end" parses "->Foo.foo=" parses "->Foo.foo=" says syntax error on "foo :: Foo" says syntax error on "foo :: Foo" parses "def foo(extend foo); end" parses "def foo(extend foo); end" says syntax error on "def foo(foo nil); end" says syntax error on "def foo(foo nil); end" says syntax error on ":bar foo" says syntax error on ":bar foo" parses "def foo;bar(end: 1);end" parses "def foo;bar(end: 1);end" parses "1;+2" parses "1;+2" parses "def foo(@require); end" parses "def foo(@require); end" parses "def foo(x @@offsetof); end" parses "def foo(x @@offsetof); end" parses "def foo(x @with); end" parses "def foo(x @with); end" parses "n & 2" parses "n & 2" parses "def foo(x @lib); end" parses "def foo(x @lib); end" parses "n << 2" parses "n << 2" parses "offsetof(X, @a)" parses "offsetof(X, @a)" parses "def *; end;" parses "def *; end;" parses ":!" parses ":!" parses "def foo(x @@extend); end" parses "def foo(x @@extend); end" parses ":<=>" parses ":<=>" parses "foo +1_i64" parses "foo +1_i64" says syntax error on "def foo() :String\nend" says syntax error on "def foo() :String\nend" parses "n &- 2" parses "n &- 2" says syntax error on "def foo(x, *); 1; end" says syntax error on "def foo(x, *); 1; end" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" parses "lib LibC; struct Foo; include Bar; end; end" parses "lib LibC; struct Foo; include Bar; end; end" says syntax error on "def foo(yield); end" says syntax error on "def foo(yield); end" parses "foo (1 + 2), 3" parses "foo (1 + 2), 3" parses "macro >>;end" parses "macro >>;end" parses "class Foo; end" parses "class Foo; end" parses "n + 2" parses "n + 2" parses "if foo\n1\nelse\n2\nend" parses "if foo\n1\nelse\n2\nend" parses "foo[*baz]" parses "foo[*baz]" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "f.x //= 2" parses "f.x //= 2" parses "lib LibC\nfun getch = \"get.char\"\nend" parses "lib LibC\nfun getch = \"get.char\"\nend" parses "*a = 1" parses "*a = 1" parses "next *1" parses "next *1" parses "%q{hello \#{foo} world}" parses "%q{hello \#{foo} world}" parses "def foo(x @extend); end" parses "def foo(x @extend); end" parses "def !~(); end;" parses "def !~(); end;" says syntax error on "foo **bar, 1" says syntax error on "foo **bar, 1" says syntax error on "foo { |(typeof)| }" says syntax error on "foo { |(typeof)| }" parses "break {1 => 2}" parses "break {1 => 2}" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "foo.> do end" parses "foo.> do end" parses "macro []?;end" parses "macro []?;end" 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 /2/" parses "a.b /2/" says syntax error on "if next; end" says syntax error on "if next; end" parses "foo(z: 0, a: n << 2)" parses "foo(z: 0, a: n << 2)" parses "property nil : Int32" parses "property nil : Int32" parses "enum Foo; private def foo; 1; end; end" parses "enum Foo; private def foo; 1; end; end" says syntax error on "foo { |(pointerof)| }" says syntax error on "foo { |(pointerof)| }" parses "{%\n1\n2\n3\n%}" parses "{%\n1\n2\n3\n%}" parses "def foo(offsetof foo); end" parses "def foo(offsetof foo); end" parses "def foo(x @@select); end" parses "def foo(x @@select); end" parses "def foo(var : self); end" parses "def foo(var : self); end" 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 "def foo(x @@self); end" parses "def foo(x @@self); end" parses "a = 1; a %=\n1" parses "a = 1; a %=\n1" parses "f.x &= 2" parses "f.x &= 2" parses "foo./(1, 2) { 3 }" parses "foo./(1, 2) { 3 }" parses "begin : Int32" parses "begin : Int32" parses "1_u128" parses "1_u128" says syntax error on "def foo(foo while); end" says syntax error on "def foo(foo while); end" says syntax error on "->::@foo.foo" says syntax error on "->::@foo.foo" parses "def foo(x y); y; end" parses "def foo(x y); y; end" parses "begin; rescue; end" parses "begin; rescue; end" parses "1 <= 2 <= 3" parses "1 <= 2 <= 3" parses "foo %i()" parses "foo %i()" parses "asm(\"nop\" ::: :)" parses "asm(\"nop\" ::: :)" parses "macro [];end" parses "macro [];end" parses "foo.<=(1, 2)" parses "foo.<=(1, 2)" parses "def foo(x @@begin); end" parses "def foo(x @@begin); end" says syntax error on "return ... 1" says syntax error on "return ... 1" parses "[1,\n 2,]" parses "[1,\n 2,]" says syntax error on "def nil?; end" says syntax error on "def nil?; end" says syntax error on "def as?; end" says syntax error on "def as?; end" parses "foo { |(_, c)| c }" parses "foo { |(_, c)| c }" parses "include : Int32" parses "include : Int32" parses "{{ //.options }}" parses "{{ //.options }}" says syntax error on "foo { |(false)| }" says syntax error on "foo { |(false)| }" parses "foo.-(1, 2)" parses "foo.-(1, 2)" parses "if (\ntrue\n)\n1\nend" parses "if (\ntrue\n)\n1\nend" parses "lib LibC; fun foo(a : Int*); end" parses "lib LibC; fun foo(a : Int*); end" says syntax error on "{\"foo\" => 1, \"bar\": 2}" says syntax error on "{\"foo\" => 1, \"bar\": 2}" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "def foo(var : self*); end" parses "def foo(var : self*); end" parses "call(foo : A, end : B)" parses "call(foo : A, end : B)" parses "A = 1" parses "A = 1" parses "property end : Int32" parses "property end : Int32" parses "foo.Bar" parses "foo.Bar" parses "def foo(var : Int); end" parses "def foo(var : Int); end" parses "->::foo=" parses "->::foo=" says syntax error on "[1 1]" says syntax error on "[1 1]" parses "def []=(*args, **opts); end" parses "def []=(*args, **opts); end" parses "def foo(&block); end" parses "def foo(&block); end" parses "foo % w()" parses "foo % w()" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "def foo(x @@struct); end" parses "def foo(x @@struct); end" parses "1.!(\n)" parses "1.!(\n)" parses "def foo(@@private); end" parses "def foo(@@private); end" says syntax error on "foo(&block) {}" says syntax error on "foo(&block) {}" parses "struct : Int32" parses "struct : Int32" says syntax error on "fun Foo : Int64\nend" says syntax error on "fun Foo : Int64\nend" parses "def foo(&block :\n Int ->); end" parses "def foo(&block :\n Int ->); end" parses "foo(a: n >> 2)" parses "foo(a: n >> 2)" parses "1 > 2" parses "1 > 2" says syntax error on "1 while 3" says syntax error on "1 while 3" says syntax error on "case 1; when break; end; end" says syntax error on "case 1; when break; end; end" parses "1 / -2" parses "1 / -2" parses "property macro : Int32" parses "property macro : Int32" parses "def foo(**args)\nargs\nend" parses "def foo(**args)\nargs\nend" 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" parses "foo(a: n === 2)" parses "foo(a: n === 2)" parses "a = 1; a &+= 1" parses "a = 1; a &+= 1" parses "def foo(protected foo); end" parses "def foo(protected foo); end" parses "break 1, *2" parses "break 1, *2" parses "as?(Bar)" parses "as?(Bar)" parses "def foo(x @while); end" parses "def foo(x @while); end" says syntax error on "break >> 1" says syntax error on "break >> 1" parses "1 =~ 2" parses "1 =~ 2" parses "A.new(\"x\", B.new(\"y\"))" parses "A.new(\"x\", B.new(\"y\"))" parses "macro =~;end" parses "macro =~;end" parses "->Foo.[]=(Int32)" parses "->Foo.[]=(Int32)" parses "def foo(x @yield); end" parses "def foo(x @yield); end" parses "foo bar.baz(1) do\nend" parses "foo bar.baz(1) do\nend" parses "def ^; end;" parses "def ^; end;" parses "foo +1" parses "foo +1" parses "n === 2" parses "n === 2" parses "return {1, 2}" parses "return {1, 2}" parses "{[] of Foo, Bar::Baz * 2}" parses "{[] of Foo, Bar::Baz * 2}" parses "while true; end;" parses "while true; end;" says syntax error on "foo { |nil| }" says syntax error on "foo { |nil| }" parses "def foo(x, **args)\n1\nend" parses "def foo(x, **args)\n1\nend" says syntax error on "def foo @@var, █ end" says syntax error on "def foo @@var, █ end" parses "foo(n &** 2)" parses "foo(n &** 2)" parses "foo(z: 0, a: n / 2)" parses "foo(z: 0, a: n / 2)" parses "def foo ; 1 ; end" parses "def foo ; 1 ; end" parses "begin; 1; ensure; 2; end" parses "begin; 1; ensure; 2; end" parses "enum Foo::Bar; A = 1; end" parses "enum Foo::Bar; A = 1; end" says syntax error on "next ** 1" says syntax error on "next ** 1" parses "foo(&.bar.baz)" parses "foo(&.bar.baz)" parses "->(x : Int32) { }" parses "->(x : Int32) { }" parses "def foo(unless foo); end" parses "def foo(unless foo); end" parses "foo(n =~ 2)" parses "foo(n =~ 2)" parses "def [](x); end" parses "def [](x); end" parses "foo(a: n % 2)" parses "foo(a: n % 2)" parses "lib LibC; struct Foo; x : Int**; end end" parses "lib LibC; struct Foo; x : Int**; end end" parses "{1 => 2, 3 => 4}" parses "{1 => 2, 3 => 4}" parses "return 1 if true" parses "return 1 if true" says syntax error on "next - 1" says syntax error on "next - 1" parses "when : Int32" parses "when : Int32" parses "f.x = - 1" parses "f.x = - 1" says syntax error on "macro foo" says syntax error on "macro foo" says syntax error on "next[0]" says syntax error on "next[0]" parses "macro /;end" parses "macro /;end" parses "a = 1; (a)/b" parses "a = 1; (a)/b" says syntax error on "A = (B = 1)" says syntax error on "A = (B = 1)" parses "foo = 1; foo {}" parses "foo = 1; foo {}" parses "def foo(@while); end" parses "def foo(@while); end" parses "macro foo(x)\n 1 + 2; end" parses "macro foo(x)\n 1 + 2; end" says syntax error on "*a, b, c, d = 1, 2" says syntax error on "*a, b, c, d = 1, 2" says syntax error on "foo &.||()" says syntax error on "foo &.||()" parses "def self.|; end;" parses "def self.|; end;" says syntax error on "a = a" says syntax error on "a = a" says syntax error on "module Foo; require \"bar\"; end" says syntax error on "module Foo; require \"bar\"; end" parses "Foo.foo(count: 3).bar { }" parses "Foo.foo(count: 3).bar { }" parses "def self.[]?; end" parses "def self.[]?; end" says syntax error on "foo(1 2)" says syntax error on "foo(1 2)" says syntax error on "while return; end" says syntax error on "while return; end" parses "def >>(); end" parses "def >>(); end" parses "foo(0, n >= 2)" parses "foo(0, n >= 2)" parses "foo(a: n & 2)" parses "foo(a: n & 2)" parses "next {1, 2}" parses "next {1, 2}" parses "foo(z: 0, a: n <= 2)" parses "foo(z: 0, a: n <= 2)" says syntax error on "foo { |typeof| }" says syntax error on "foo { |typeof| }" parses "foo &.+(2)" parses "foo &.+(2)" parses "def foo(instance_sizeof foo); end" parses "def foo(instance_sizeof foo); end" says syntax error on "\"hello\" foo" says syntax error on "\"hello\" foo" parses "->Foo.foo!" parses "->Foo.foo!" parses "foo(n <= 2)" parses "foo(n <= 2)" says syntax error on "->::@@foo.foo" says syntax error on "->::@@foo.foo" parses "if foo\n1\nend" parses "if foo\n1\nend" global regex match data parses "$1" parses "$1" parses "$1?" parses "$1?" parses "$?" parses "$?" parses "$~.foo" parses "$~.foo" says syntax error on "$99999999999999999999999?" says syntax error on "$99999999999999999999999?" parses "foo $1" parses "foo $1" parses "$~ = 1" parses "$~ = 1" parses "$?.foo" parses "$?.foo" says syntax error on "$0 = 1" says syntax error on "$0 = 1" parses "foo $?" parses "foo $?" says syntax error on "$0, a = {1, 2}" says syntax error on "$0, a = {1, 2}" parses "$? = 1" parses "$? = 1" parses "$0" parses "$0" says syntax error on "$0, $1 = [1, 2]" says syntax error on "$0, $1 = [1, 2]" parses "$~" parses "$~" says syntax error on "$2147483648" says syntax error on "$2147483648" parses "def foo(return foo); end" parses "def foo(return foo); end" says syntax error on "A = foo(B = 1)" says syntax error on "A = foo(B = 1)" parses "\"hello \" \\\r\n \"world\"" parses "\"hello \" \\\r\n \"world\"" 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" says syntax error on "foo { |enum| }" says syntax error on "foo { |enum| }" parses "lib LibC\nfun getchar(...)\nend" parses "lib LibC\nfun getchar(...)\nend" parses "foo(0, n & 2)" parses "foo(0, n & 2)" parses "{% begin %}%Q< %s >{% end %}" parses "{% begin %}%Q< %s >{% end %}" parses "case;end" parses "case;end" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "def foo(a); a; end" parses "def foo(a); a; end" parses "def foo(@until); end" parses "def foo(@until); end" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "()" parses "()" parses "def self.^; end;" parses "def self.^; end;" parses "return *{1, 2}" parses "return *{1, 2}" parses "def foo(var = 1); end" parses "def foo(var = 1); end" parses "case : Int32" parses "case : Int32" says syntax error on "def foo(nil); end" says syntax error on "def foo(nil); end" parses "case\nend" parses "case\nend" parses "foo(n > 2)" parses "foo(n > 2)" parses "1.as? Bar" parses "1.as? Bar" says syntax error on "def foo(foo enum); end" says syntax error on "def foo(foo enum); end" parses "@a = uninitialized Foo" parses "@a = uninitialized Foo" parses "foo..2" parses "foo..2" parses "foo.^ 1, 2" parses "foo.^ 1, 2" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "foo do; 1; end" parses "foo do; 1; end" parses "def >=; end;" parses "def >=; end;" parses "def foo(self foo); end" parses "def foo(self foo); end" parses "foo = 1; ->foo.>(Int32)" parses "foo = 1; ->foo.>(Int32)" parses "Foo(T, 1)" parses "Foo(T, 1)" parses "def self.===; end;" parses "def self.===; end;" parses "foo(a: n < 2)" parses "foo(a: n < 2)" parses ":>>" parses ":>>" parses "def foo(a, &block : Int, Float -> Double); end" parses "def foo(a, &block : Int, Float -> Double); end" parses "foo(n !~ 2)" parses "foo(n !~ 2)" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" parses "{% begin %}%q( %s ){% end %}" parses "{% begin %}%q( %s ){% end %}" parses "foo &.block[0] = 1" parses "foo &.block[0] = 1" sets correct location of parameter in proc literal sets correct location of parameter in proc literal parses "def foo(@@abstract); end" parses "def foo(@@abstract); end" parses "a.b/2" parses "a.b/2" parses "@@a, b = 1, 2" parses "@@a, b = 1, 2" says syntax error on "break * 1" says syntax error on "break * 1" parses "<<-FOO\n \t1\n \tFOO" parses "<<-FOO\n \t1\n \tFOO" parses "unless : Int32" parses "unless : Int32" parses "x[a: 1, b: 2]" parses "x[a: 1, b: 2]" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" says syntax error on "macro foo(\"\" y); end" says syntax error on "macro foo(\"\" y); end" says syntax error on "def foo(**args, *x); end" says syntax error on "def foo(**args, *x); end" says syntax error on "next[]" says syntax error on "next[]" parses "->::Foo.foo=" parses "->::Foo.foo=" parses "next" parses "next" parses "foo.| 1, 2" parses "foo.| 1, 2" parses "def foo(x @include); end" parses "def foo(x @include); end" parses "nil : Int32" parses "nil : Int32" says syntax error on "def foo(protected); end" says syntax error on "def foo(protected); end" parses "def self.~; end;" parses "def self.~; end;" says syntax error on "fun foo\nFoo = 1" says syntax error on "fun foo\nFoo = 1" says syntax error on "*a, b, c, d, e = 1, 2" says syntax error on "*a, b, c, d, e = 1, 2" parses "def foo; yield; end" parses "def foo; yield; end" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "abstract struct Foo; end" parses "abstract struct Foo; end" parses "class Foo\nend" parses "class Foo\nend" parses "while : Int32" parses "while : Int32" says syntax error on "foo { |(if)| }" says syntax error on "foo { |(if)| }" parses "property else : Int32" parses "property else : Int32" says syntax error on "return - 1" says syntax error on "return - 1" says syntax error on "{1, ->{ |_| x } }" says syntax error on "{1, ->{ |_| x } }" parses "property def : Int32" parses "property def : Int32" parses "a = /=/" parses "a = /=/" says syntax error on "macro foo;{%end};end" says syntax error on "macro foo;{%end};end" parses "Foo.bar x.y do\nend" parses "Foo.bar x.y do\nend" parses "def foo\n1\nend" parses "def foo\n1\nend" parses "self / number" parses "self / number" parses "def foo(x @protected); end" parses "def foo(x @protected); end" parses "def foo(x @@out); end" parses "def foo(x @@out); end" parses "foo { a = 1 }; a" parses "foo { a = 1 }; a" parses "->Foo.&*(Int32)" parses "->Foo.&*(Int32)" parses "foo &.@bar" parses "foo &.@bar" parses "foo &.each {\n}" parses "foo &.each {\n}" says syntax error on "def foo(&a foo); end" says syntax error on "def foo(&a foo); end" parses "[] of ->;" parses "[] of ->;" says syntax error on "foo(**bar, *x)" says syntax error on "foo(**bar, *x)" parses "foo.bar(1, 2)" parses "foo.bar(1, 2)" says syntax error on "return.foo" says syntax error on "return.foo" parses "foo.- do end" parses "foo.- do end" parses "alignof(\n Int32\n)" parses "alignof(\n Int32\n)" parses ":\u304B\u305F\u306A" parses ":\u304B\u305F\u306A" parses "def foo(out foo); end" parses "def foo(out foo); end" parses "a.b &*=\n1" parses "a.b &*=\n1" parses "+1" parses "+1" 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" says syntax error on "foo { |(macro)| }" says syntax error on "foo { |(macro)| }" parses "->\n:\nInt32\n{\n}" parses "->\n:\nInt32\n{\n}" parses "%x(`which(foo)`)" parses "%x(`which(foo)`)" parses "puts {{1}}" parses "puts {{1}}" parses "case 1\nwhen .as?(T)\n2\nend" parses "case 1\nwhen .as?(T)\n2\nend" parses "macro foo\n\"\\\\\"\nend" parses "macro foo\n\"\\\\\"\nend" parses "def foo(x : U) forall U; end" parses "def foo(x : U) forall U; end" parses "1_i128" parses "1_i128" parses "def foo(x @@with); end" parses "def foo(x @@with); end" says syntax error on "def foo(typeof); end" says syntax error on "def foo(typeof); end" parses "a : Foo" parses "a : Foo" parses "->@@foo.foo?" parses "->@@foo.foo?" parses "foo.nil?( )" parses "foo.nil?( )" parses "/ /\n/ /" parses "/ /\n/ /" says syntax error on "foo(next)" says syntax error on "foo(next)" parses "macro foo;unless %var;true;end;end" parses "macro foo;unless %var;true;end;end" says syntax error on "return .. 1" says syntax error on "return .. 1" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" says syntax error on "foo { |class| }" says syntax error on "foo { |class| }" parses "@[Foo(\n1, foo: 2\n)]" parses "@[Foo(\n1, foo: 2\n)]" parses "a = 1; a //=\n1" parses "a = 1; a //=\n1" says syntax error on "a = 1, b = 2" says syntax error on "a = 1, b = 2" parses "def foo(struct foo); end" parses "def foo(struct foo); end" parses "Int[8]" parses "Int[8]" parses "1 === 2" parses "1 === 2" parses "begin; 1; rescue Foo; 2; end" parses "begin; 1; rescue Foo; 2; end" says syntax error on "break &+ 1" says syntax error on "break &+ 1" 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 = 1; a **= 1" parses "a = 1; a **= 1" parses "def foo(x @alias); end" parses "def foo(x @alias); end" parses "a = 1; yield a rescue a" parses "a = 1; yield a rescue a" parses "def foo(alias foo); end" parses "def foo(alias foo); end" parses "x.y=(1).to_s" parses "x.y=(1).to_s" parses "Foo?" parses "Foo?" parses "yield if true" parses "yield if true" says syntax error on "x[1:-2]" says syntax error on "x[1:-2]" parses "as(Bar)" parses "as(Bar)" says syntax error on "def responds_to?; end" says syntax error on "def responds_to?; end" parses "lib LibC\nfun SomeFun\nend" parses "lib LibC\nfun SomeFun\nend" parses "n | 2" parses "n | 2" parses "call \"foo\"" parses "call \"foo\"" parses "def foo(x @instance_sizeof); end" parses "def foo(x @instance_sizeof); end" parses "->Foo.&+(Int32)" parses "->Foo.&+(Int32)" parses "a\nwhile / /\n/ /\nend" parses "a\nwhile / /\n/ /\nend" parses "class Foo < self; end" parses "class Foo < self; end" parses "@@foo/2" parses "@@foo/2" parses "def foo : Int32\n1\nend" parses "def foo : Int32\n1\nend" says syntax error on "*1, a = 2" says syntax error on "*1, a = 2" says syntax error on "break ... 1" says syntax error on "break ... 1" says syntax error on "return * 1" says syntax error on "return * 1" parses "Set {1, 2, 3}" parses "Set {1, 2, 3}" parses "{% for _, x, _ in y %}body{% end %}" parses "{% for _, x, _ in y %}body{% end %}" says syntax error on "def foo(foo false); end" says syntax error on "def foo(foo false); end" parses "def foo(@break); end" parses "def foo(@break); end" parses "foo.bar(1).baz" parses "foo.bar(1).baz" parses "->@@foo.foo" parses "->@@foo.foo" says syntax error on "def foo:String\nend" says syntax error on "def foo:String\nend" parses "foo.>" parses "foo.>" parses "break *1, 2" parses "break *1, 2" parses "1\\\r\n + 2" parses "1\\\r\n + 2" parses "foo(z: 0, a: n === 2)" parses "foo(z: 0, a: n === 2)" parses "foo(a: n &+ 2)" parses "foo(a: n &+ 2)" parses "foo %i" parses "foo %i" says syntax error on "foo { |(protected)| }" says syntax error on "foo { |(protected)| }" parses "def !=(*args, **opts); end" parses "def !=(*args, **opts); end" says syntax error on "def foo(foo offsetof); end" says syntax error on "def foo(foo offsetof); end" says syntax error on "def foo(foo begin); end" says syntax error on "def foo(foo begin); end" says syntax error on "+break" says syntax error on "+break" says syntax error on "'a' foo" says syntax error on "'a' foo" parses "def foo; / /; end" parses "def foo; / /; end" parses "Foo::Bar" parses "Foo::Bar" parses "asm(\"nop\" :: : :)" parses "asm(\"nop\" :: : :)" parses "foo.&(1, 2)" parses "foo.&(1, 2)" parses ":\"\\u{61}\"" parses ":\"\\u{61}\"" parses "property protected : Int32" parses "property protected : Int32" says syntax error on "next + 1" says syntax error on "next + 1" parses "yield" parses "yield" says syntax error on "foo { |extend| }" says syntax error on "foo { |extend| }" parses "[\n1\n]" parses "[\n1\n]" says syntax error on "class Foo(T, T); end" says syntax error on "class Foo(T, T); end" parses "def foo(@in); end" parses "def foo(@in); end" 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 "foo(a: n // 2)" parses "foo(a: n // 2)" parses "else : Int32" parses "else : Int32" parses "1 +2.0" parses "1 +2.0" says syntax error on "return === 1" says syntax error on "return === 1" says syntax error on "def foo(return); end" says syntax error on "def foo(return); end" says syntax error on "foo { |(yield)| }" says syntax error on "foo { |(yield)| }" parses "foo.bar(1, 2) { 3 }" parses "foo.bar(1, 2) { 3 }" parses "1 // 2" parses "1 // 2" sets correct location of named tuple type sets correct location of named tuple type parses "Foo(T | U)" parses "Foo(T | U)" parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "def foo(@typeof); end" parses "def foo(@typeof); end" says syntax error on "1 ... return" says syntax error on "1 ... return" parses "foo.& 1, 2" parses "foo.& 1, 2" says syntax error on "foo.&&" says syntax error on "foo.&&" says syntax error on "{a: 1, \"\": 2}" says syntax error on "{a: 1, \"\": 2}" says syntax error on "foo.responds_to?" says syntax error on "foo.responds_to?" parses "f.x += 2" parses "f.x += 2" parses "->@foo.foo?" parses "->@foo.foo?" parses "1 =~ 2" parses "1 =~ 2" says syntax error on "foo { |macro| }" says syntax error on "foo { |macro| }" parses "a : Foo()[12]" parses "a : Foo()[12]" parses ":[]?" parses ":[]?" parses "call foo : A, end : B" parses "call foo : A, end : B" parses "foo = 1; ->foo.//(Int32)" parses "foo = 1; ->foo.//(Int32)" parses "foo.*(1, 2) { 3 }" parses "foo.*(1, 2) { 3 }" parses "Foo(1)" parses "Foo(1)" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "next 1 if true" parses "next 1 if true" parses "def foo(x = / /); end" parses "def foo(x = / /); end" says syntax error on "@[Foo(\"\": 1)]" says syntax error on "@[Foo(\"\": 1)]" parses "foo(\n1)" parses "foo(\n1)" parses "def +; end;" parses "def +; end;" parses "[1, 2] of Int" parses "[1, 2] of Int" says syntax error on "case 1; when return; end; end" says syntax error on "case 1; when return; end; end" says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "{1, ->do\n|x| x\end }" parses "def foo(a, &block); end" parses "def foo(a, &block); end" parses "def >=(other, file = 1); end" parses "def >=(other, file = 1); end" parses "def <(); end;" parses "def <(); end;" parses "def !=(other, file = 1); end" parses "def !=(other, file = 1); end" says syntax error on "macro nil?; end" says syntax error on "macro nil?; end" parses "1 ? 2 : 3" parses "1 ? 2 : 3" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "a, b, *c = 1, 2" parses "a, b, *c = 1, 2" parses "a.foo, a.bar = 1, 2" parses "a.foo, a.bar = 1, 2" parses "/foo/" parses "/foo/" parses "a = 1; a/b" parses "a = 1; a/b" parses "def foo(@@next); end" parses "def foo(@@next); end" parses "1 rescue 2 if 3" parses "1 rescue 2 if 3" parses "foo.bar 1, 2" parses "foo.bar 1, 2" parses "foo" parses "foo" parses "offsetof(X, 1)" parses "offsetof(X, 1)" says syntax error on "def foo(foo yield); end" says syntax error on "def foo(foo yield); end" parses "a.b |=\n1" parses "a.b |=\n1" says syntax error on "foo(\"\": 1)" says syntax error on "foo(\"\": 1)" parses "foo { |(_, c, )| c }" parses "foo { |(_, c, )| c }" parses "def foo(a, &block : *Int -> ); end" parses "def foo(a, &block : *Int -> ); end" parses "foo(/ /)" parses "foo(/ /)" parses "elsif : Int32" parses "elsif : Int32" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "1+2*3" parses "1+2*3" parses "var.@foo" parses "var.@foo" parses ":\"\"" parses ":\"\"" parses "foo = 1; foo(-1)" parses "foo = 1; foo(-1)" parses "if foo; 1; elsif bar; 2; else 3; end" parses "if foo; 1; elsif bar; 2; else 3; end" parses "foo = 1; ->foo.&+(Int32)" parses "foo = 1; ->foo.&+(Int32)" parses "def *(); end" parses "def *(); end" parses "{{ foo.nil? }}" parses "{{ foo.nil? }}" says syntax error on "def foo=(&block); end" says syntax error on "def foo=(&block); end" parses "a/b" parses "a/b" parses "->Foo.^(Int32)" parses "->Foo.^(Int32)" parses "def foo(x @case); end" parses "def foo(x @case); end" says syntax error on "asm(\"\" : 1)" says syntax error on "asm(\"\" : 1)" parses "{% begin %}%| %s |{% end %}" parses "{% begin %}%| %s |{% end %}" parses "sizeof : Int32" parses "sizeof : Int32" says syntax error on "def foo(offsetof); end" says syntax error on "def foo(offsetof); end" parses "return 1.bar do\nend" parses "return 1.bar do\nend" parses "{/ / => / /, / / => / /}" parses "{/ / => / /, / / => / /}" parses "foo.- 1, 2" parses "foo.- 1, 2" parses "1 / 2" parses "1 / 2" says syntax error on "def foo():String\nend" says syntax error on "def foo():String\nend" parses "def foo(x @@class); end" parses "def foo(x @@class); end" parses "1 | 2" parses "1 | 2" parses "def foo(\"bar qux\" y); y; end" parses "def foo(\"bar qux\" y); y; end" parses "{% begin %}%Q{ %s }{% end %}" parses "{% begin %}%Q{ %s }{% end %}" parses "a; if / /; / /; elsif / /; / /; end" parses "a; if / /; / /; elsif / /; / /; end" says syntax error on "def foo(*a foo); end" says syntax error on "def foo(*a foo); end" parses "property return : Int32" parses "property return : Int32" says syntax error on "b! = 1" says syntax error on "b! = 1" says syntax error on "def foo(**args, **args2); end" says syntax error on "def foo(**args, **args2); end" parses "!1" parses "!1" 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 "def foo?=(x); end" says syntax error on "def foo?=(x); end" parses "case\nwhen true\n1\nend" parses "case\nwhen true\n1\nend" parses "macro foo(@[Foo] **args);end" parses "macro foo(@[Foo] **args);end" parses "foo = 1; ->foo.foo?" parses "foo = 1; ->foo.foo?" parses "foo(0, n > 2)" parses "foo(0, n > 2)" parses "def foo; with a yield; end" parses "def foo; with a yield; end" sets correct location of tuple type sets correct location of tuple type parses "{foo:'a', bar:'b'}" parses "{foo:'a', bar:'b'}" parses "foo.bar" parses "foo.bar" says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "foo(1, 2, 3 end" says syntax error on "foo(1, 2, 3 end" says syntax error on "macro foo(**x, y)" says syntax error on "macro foo(**x, y)" says syntax error on "break &** 1" says syntax error on "break &** 1" parses "def foo(x @var); end" parses "def foo(x @var); end" parses "foo(z: 0, a: n < 2)" parses "foo(z: 0, a: n < 2)" says syntax error on "foo { |lib| }" says syntax error on "foo { |lib| }" parses "foo%r" parses "foo%r" parses "foo(n >= 2)" parses "foo(n >= 2)" parses "a.b +=\n1" parses "a.b +=\n1" parses "T::U/1" parses "T::U/1" says syntax error on "foo[1] = break" says syntax error on "foo[1] = break" parses "foo(0, n < 2)" parses "foo(0, n < 2)" parses "until : Int32" parses "until : Int32" parses "foo { |(a, *b, c)| }" parses "foo { |(a, *b, c)| }" parses "foo(z: 0, a: n >> 2)" parses "foo(z: 0, a: n >> 2)" parses "def foo(@var); end" parses "def foo(@var); end" parses "'a'" parses "'a'" parses "def foo(@@out); end" parses "def foo(@@out); end" parses "foo = 1; ->foo.&*(Int32)" parses "foo = 1; ->foo.&*(Int32)" says syntax error on "foo { |(private)| }" says syntax error on "foo { |(private)| }" parses "1.[]?(2)" parses "1.[]?(2)" says syntax error on "def foo(x y, x z); end" says syntax error on "def foo(x y, x z); end" parses "def foo(x @@next); end" parses "def foo(x @@next); end" parses "def self.foo\n1\nend" parses "def self.foo\n1\nend" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "- 1" parses "- 1" says syntax error on "pointerof(self)" says syntax error on "pointerof(self)" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "case 1\nwhen .is_a?(T)\n2\nend" says syntax error on "foo { |(alias)| }" says syntax error on "foo { |(alias)| }" says syntax error on "break === 1" says syntax error on "break === 1" parses "property case : Int32" parses "property case : Int32" parses "def foo; a = 1; x { a }; end" parses "def foo; a = 1; x { a }; end" parses "a.foo &block" parses "a.foo &block" says syntax error on "foo(**bar, out x)" says syntax error on "foo(**bar, out x)" parses "foo &block" parses "foo &block" parses "def foo(var : self.class); end" parses "def foo(var : self.class); end" parses "foo(z: 0, a: n ** 2)" parses "foo(z: 0, a: n ** 2)" parses "1.x; foo do\nend" parses "1.x; foo do\nend" parses "def <=(); end" parses "def <=(); end" parses "def type(type); end" parses "def type(type); end" parses "macro foo;%var{1, x} = hello;end" parses "macro foo;%var{1, x} = hello;end" parses "foo.!= 1, 2" parses "foo.!= 1, 2" says syntax error on "foo { |protected| }" says syntax error on "foo { |protected| }" parses "macro >;end" parses "macro >;end" 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 "def foo(@@struct); end" parses "def foo(@@struct); end" says syntax error on "return <= 1" says syntax error on "return <= 1" parses "foo(&.is_a?(T))" parses "foo(&.is_a?(T))" parses "def foo(x @begin); end" parses "def foo(x @begin); end" parses "foo(z: 0, a: n > 2)" parses "foo(z: 0, a: n > 2)" parses "@@a = uninitialized Foo" parses "@@a = uninitialized Foo" parses "1.!" parses "1.!" parses "def >=(*args, **opts); end" parses "def >=(*args, **opts); end" says syntax error on "yield break" says syntax error on "yield break" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "def foo(x @out); end" parses "def foo(x @out); end" parses "a() /3" parses "a() /3" parses "puts _" parses "puts _" says syntax error on "return ** 1" says syntax error on "return ** 1" parses "case {1, 2}\nwhen foo\n5\nend" parses "case {1, 2}\nwhen foo\n5\nend" parses "def foo(\n&block\n); end" parses "def foo(\n&block\n); end" parses "a[0], a[1] = 1, 2" parses "a[0], a[1] = 1, 2" parses "def foo(**args)\n1\nend" parses "def foo(**args)\n1\nend" parses "property extend : Int32" parses "property extend : Int32" parses "foo.!~" parses "foo.!~" parses "foo\n.bar" parses "foo\n.bar" parses "macro foo; 1 + 2; end" parses "macro foo; 1 + 2; end" parses "def foo(x @end); end" parses "def foo(x @end); end" parses "foo(n < 2)" parses "foo(n < 2)" parses "foo 1.bar do\nend" parses "foo 1.bar do\nend" parses "1/2" parses "1/2" parses "x = 1; foo.bar x do\nend" parses "x = 1; foo.bar x do\nend" parses "`foo\\``" parses "`foo\\``" parses "def foo(a, &block : self -> self); end" parses "def foo(a, &block : self -> self); end" parses "property yield : Int32" parses "property yield : Int32" parses "def foo(while foo); end" parses "def foo(while foo); end" parses "&- 1" parses "&- 1" parses "def %(); end;" parses "def %(); end;" says syntax error on "offsetof(X, 'c')" says syntax error on "offsetof(X, 'c')" parses "def >=(); end" parses "def >=(); end" parses "macro &*;end" parses "macro &*;end" parses "macro &-;end" parses "macro &-;end" parses "class Foo(T); end" parses "class Foo(T); end" parses "extend self" parses "extend self" says syntax error on "case 1 == 1 a; when 2; end" says syntax error on "case 1 == 1 a; when 2; end" parses "n &+ 2" parses "n &+ 2" says syntax error on "foo { |(fun)| }" says syntax error on "foo { |(fun)| }" parses "foo(z: 0, a: n % 2)" parses "foo(z: 0, a: n % 2)" parses "macro ~;end" parses "macro ~;end" parses "def foo(\nvar\n); end" parses "def foo(\nvar\n); end" says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "[\n\"foo\"\n\"bar\"\n]" parses "1 .. 2" parses "1 .. 2" parses "def foo(module foo); end" parses "def foo(module foo); end" parses "x : Foo(A, *B, C)" parses "x : Foo(A, *B, C)" parses "alias Foo = Bar" parses "alias Foo = Bar" says syntax error on "a() = 1" says syntax error on "a() = 1" says syntax error on "1 ... break" says syntax error on "1 ... break" parses "instance_sizeof : Int32" parses "instance_sizeof : Int32" parses "1 &* 2" parses "1 &* 2" says syntax error on "->(x, y z) { }" says syntax error on "->(x, y z) { }" parses "Foo(typeof(1), typeof(2))" parses "Foo(typeof(1), typeof(2))" parses "1.[](2)" parses "1.[](2)" parses "->(x) { x }" parses "->(x) { x }" parses "\"hello \"\\\r\n\"world\"" parses "\"hello \"\\\r\n\"world\"" parses "Foo(X, sizeof(Int32))" parses "Foo(X, sizeof(Int32))" parses "{foo:\"a\", bar:\"b\"}" parses "{foo:\"a\", bar:\"b\"}" parses "def foo; x { |_| 1 }; end" parses "def foo; x { |_| 1 }; end" parses "def foo\n1\nend\nif 1\nend" parses "def foo\n1\nend\nif 1\nend" parses "def foo(x @@def); end" parses "def foo(x @@def); end" parses "def +(); end;" parses "def +(); end;" says syntax error on "enum Foo < UInt16; end" says syntax error on "enum Foo < UInt16; end" says syntax error on "def foo(extend); end" says syntax error on "def foo(extend); end" parses "def %(); end" parses "def %(); end" parses "def foo(x @@yield); end" parses "def foo(x @@yield); end" says syntax error on "foo { |alias| }" says syntax error on "foo { |alias| }" parses "1 ** -x" parses "1 ** -x" parses "case 1\nin false; 2; end" parses "case 1\nin false; 2; end" parses "&+ 1" parses "&+ 1" parses "macro ===;end" parses "macro ===;end" parses "foo(a: n <= 2)" parses "foo(a: n <= 2)" parses "macro foo\n\"\\'\"\nend" parses "macro foo\n\"\\'\"\nend" parses "[\n1, 2]" parses "[\n1, 2]" parses "1 + 2" parses "1 + 2" parses "foo(z: 0, a: n - 2)" parses "foo(z: 0, a: n - 2)" parses "foo(z: 0, a: n >= 2)" parses "foo(z: 0, a: n >= 2)" parses "{% unless 1\n x\nend %}" parses "{% unless 1\n x\nend %}" says syntax error on "return ? 1 : 2" says syntax error on "return ? 1 : 2" parses "property while : Int32" parses "property while : Int32" parses "->Foo.==(Int32)" parses "->Foo.==(Int32)" parses "1 < 2" parses "1 < 2" parses "foo = 1; ->foo.foo=" parses "foo = 1; ->foo.foo=" parses "a.b %=\n1" parses "a.b %=\n1" parses "def foo(x @@module); end" parses "def foo(x @@module); end" parses "property if : Int32" parses "property if : Int32" parses "foo.bar do end" parses "foo.bar do end" says syntax error on "def foo\nlib\nend" says syntax error on "def foo\nlib\nend" parses "foo(n === 2)" parses "foo(n === 2)" parses "Foo(T, 1, U)" parses "Foo(T, 1, U)" parses "foo(&block)" parses "foo(&block)" parses "1" parses "1" sets correct location of argument in named tuple type sets correct location of argument in named tuple type parses "1 || 2" parses "1 || 2" parses "foo(bar { })" parses "foo(bar { })" parses "def foo(@@unless); end" parses "def foo(@@unless); end" parses "extend Foo\nif true; end" parses "extend Foo\nif true; end" parses "`foo`" parses "`foo`" parses "foo.!.!" parses "foo.!.!" parses "enum Foo; @[Bar]; end" parses "enum Foo; @[Bar]; end" says syntax error on "def foo(with); end" says syntax error on "def foo(with); end" parses "def foo(@next); end" parses "def foo(@next); end" says syntax error on "a, B = 1, 2" says syntax error on "a, B = 1, 2" says syntax error on "next <= 1" says syntax error on "next <= 1" parses "<<-FOO\n \t 1\n \t FOO" parses "<<-FOO\n \t 1\n \t FOO" parses "foo &.bar.baz" parses "foo &.bar.baz" says syntax error on "case when .foo? then 1; end" says syntax error on "case when .foo? then 1; end" parses "def foo(bar = 1\n); 2; end" parses "def foo(bar = 1\n); 2; end" says syntax error on "1 foo" says syntax error on "1 foo" parses "Foo(T?)" parses "Foo(T?)" says syntax error on "break <= 1" says syntax error on "break <= 1" parses "def self.>=(); end;" parses "def self.>=(); end;" parses "a : Foo*" parses "a : Foo*" parses "begin; 1; rescue; 2; end" parses "begin; 1; rescue; 2; end" parses "-1_i64" parses "-1_i64" parses "{% begin %}%r<\\A>{% end %}" parses "{% begin %}%r<\\A>{% end %}" parses "def foo(@alias); end" parses "def foo(@alias); end" parses "def ===(other, file = 1); end" parses "def ===(other, file = 1); end" parses "a, *b = 1" parses "a, *b = 1" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" parses "foo(n & 2)" parses "foo(n & 2)" parses "->::foo!" parses "->::foo!" parses "/foo/m" parses "/foo/m" parses "def foo(case foo); end" parses "def foo(case foo); end" parses "call(foo.as Bar, Baz)" parses "call(foo.as Bar, Baz)" says syntax error on "while next; end" says syntax error on "while next; end" parses "foo if 3" parses "foo if 3" parses "x[..2]" parses "x[..2]" says syntax error on "until break; end" says syntax error on "until break; end" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "..2" parses "..2" parses "property true : Int32" parses "property true : Int32" parses "{% begin %}%w| %s |{% end %}" parses "{% begin %}%w| %s |{% end %}" says syntax error on "1 == 2, a = 4" says syntax error on "1 == 2, a = 4" parses "b.c &&= 1" parses "b.c &&= 1" parses "foo.[]= do end" parses "foo.[]= do end" parses "break if true" parses "break if true" parses "1 \\\n + 2" parses "1 \\\n + 2" parses "::Foo{\"x\" => \"y\"}" parses "::Foo{\"x\" => \"y\"}" parses "struct Foo; end" parses "struct Foo; end" says syntax error on "require 1" says syntax error on "require 1" says syntax error on "def foo(lib); end" says syntax error on "def foo(lib); end" says syntax error on "def foo(foo if); end" says syntax error on "def foo(foo if); end" parses "a = 1; a *=\n1" parses "a = 1; a *=\n1" parses "->Foo./(Int32)" parses "->Foo./(Int32)" parses "Foo({String, ->})" parses "Foo({String, ->})" parses "qux \"foo\#{bar do end}baz\"" parses "qux \"foo\#{bar do end}baz\"" parses "Int" parses "Int" says syntax error on "foo { |(class)| }" says syntax error on "foo { |(class)| }" parses "def >=(); end;" parses "def >=(); end;" says syntax error on "unless return; end" says syntax error on "unless return; end" says syntax error on "*a === 1" says syntax error on "*a === 1" says syntax error on "return do\nend" says syntax error on "return do\nend" says syntax error on "+return" says syntax error on "+return" parses "case 1\nin Int32.class; 2; end" parses "case 1\nin Int32.class; 2; end" says syntax error on "def foo(asm); end" says syntax error on "def foo(asm); end" parses "case 1\nin Int32; 2; end" parses "case 1\nin Int32; 2; end" parses "foo %x" parses "foo %x" parses "until true; end;" parses "until true; end;" says syntax error on "next / 1" says syntax error on "next / 1" parses "call ->foo" parses "call ->foo" calls with blocks within index operator (#12818) parses "foo.[bar { 1 }]" parses "foo.[bar { 1 }]" 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 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 "foo(**bar)" parses "foo(**bar)" parses "lib Foo::Bar\nend" parses "lib Foo::Bar\nend" parses ":>" parses ":>" parses "property typeof : Int32" parses "property typeof : Int32" parses "->Foo.**(Int32)" parses "->Foo.**(Int32)" says syntax error on "yield next" says syntax error on "yield next" parses "property begin : Int32" parses "property begin : Int32" says syntax error on "def foo(true); end" says syntax error on "def foo(true); end" parses "lib LibC\nalias Foo = Bar\nend" parses "lib LibC\nalias Foo = Bar\nend" parses "def foo(asm foo); end" parses "def foo(asm foo); end" parses "Foo(\n)" parses "Foo(\n)" parses "def foo(@@require); end" parses "def foo(@@require); end" parses "foo(z: 0, a: n & 2)" parses "foo(z: 0, a: n & 2)" parses "foo = 1; ->foo.foo" parses "foo = 1; ->foo.foo" parses "a = 1; a &*=\n1" parses "a = 1; a &*=\n1" parses "foo.!( )" parses "foo.!( )" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "{% x if 1 %}" parses "{% x if 1 %}" parses "foo.-(1, 2) { 3 }" parses "foo.-(1, 2) { 3 }" sets correct location of protected macro in enum sets correct location of protected macro in enum says syntax error on "foo &.||" says syntax error on "foo &.||" parses "def self.foo()\n1\nend" parses "def self.foo()\n1\nend" says syntax error on "x { |*a, *b| }" says syntax error on "x { |*a, *b| }" says syntax error on "foo { |true| }" says syntax error on "foo { |true| }" parses "1\n+2" parses "1\n+2" parses "case 1\nwhen .as(T)\n2\nend" parses "case 1\nwhen .as(T)\n2\nend" parses "x = 1; foo x do\nend" parses "x = 1; foo x do\nend" parses "def foo(@[Foo] @var); end" parses "def foo(@[Foo] @var); end" parses "def foo(@@var = 1); 1; end" parses "def foo(@@var = 1); 1; end" says syntax error on "foo { |(end)| }" says syntax error on "foo { |(end)| }" parses "->() : Int32 { }" parses "->() : Int32 { }" parses "[] of {String, ->}" parses "[] of {String, ->}" parses "def foo(x @nil); end" parses "def foo(x @nil); end" parses "1.tap do; 1; rescue; 2; end" parses "1.tap do; 1; rescue; 2; end" parses "def foo(@@offsetof); end" parses "def foo(@@offsetof); end" parses "def foo(x @@enum); end" parses "def foo(x @@enum); end" parses "def -(); end;" parses "def -(); end;" parses ":%" parses ":%" parses "def foo(@@case); end" parses "def foo(@@case); end" parses "def foo(require foo); end" parses "def foo(require foo); end" parses "def foo(var : Int**); end" parses "def foo(var : Int**); end" parses "def foo(x @@until); end" parses "def foo(x @@until); end" says syntax error on "+next" says syntax error on "+next" parses "def self.==(); end;" parses "def self.==(); end;" parses "<<-'EOF'.x\n foo\nEOF" parses "<<-'EOF'.x\n foo\nEOF" parses "foo do\n//\nend" parses "foo do\n//\nend" parses "def []?; end" parses "def []?; end" parses "1 ensure 2 if 3" parses "1 ensure 2 if 3" parses "\"foo\#{\"bar\"}baz\"" parses "\"foo\#{\"bar\"}baz\"" parses "def self.>; end;" parses "def self.>; end;" says syntax error on "def foo(foo select); end" says syntax error on "def foo(foo select); end" parses "{foo:a, bar:b}" parses "{foo:a, bar:b}" parses "macro &+;end" parses "macro &+;end" parses "\"foo\#{bar}baz\"" parses "\"foo\#{bar}baz\"" parses "{\"foo\": 1, \"bar\": 2}" parses "{\"foo\": 1, \"bar\": 2}" parses "1 +2_i64" parses "1 +2_i64" parses "1.~" parses "1.~" parses "Foo??" parses "Foo??" parses "foo { |a, b| 1 }" parses "foo { |a, b| 1 }" parses ":=~" parses ":=~" says syntax error on "def foo(foo break); end" says syntax error on "def foo(foo break); end" parses "1.0_f32" parses "1.0_f32" says syntax error on "def foo\ndef\nend" says syntax error on "def foo\ndef\nend" says syntax error on "next * 1" says syntax error on "next * 1" parses "foo.>=" parses "foo.>=" parses "foo(n == 2)" parses "foo(n == 2)" says syntax error on "foo { |out| }" says syntax error on "foo { |out| }" parses "def foo; end" parses "def foo; end" parses "foo &.each do\nend" parses "foo &.each do\nend" parses "sizeof(\n Int32\n)" parses "sizeof(\n Int32\n)" 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" says syntax error on "next.foo" says syntax error on "next.foo" parses "1 &+ 2" parses "1 &+ 2" parses "property when : Int32" parses "property when : Int32" says syntax error on "macro foo(*x, *y); end" says syntax error on "macro foo(*x, *y); end" says syntax error on "macro foo x; 1 + 2; end" says syntax error on "macro foo x; 1 + 2; end" parses "n &* 2" parses "n &* 2" parses "def foo(@case); end" parses "def foo(@case); end" parses "foo%Q" parses "foo%Q" parses "foo.>=(1, 2) { 3 }" parses "foo.>=(1, 2) { 3 }" says syntax error on "def foo(foo in); end" says syntax error on "def foo(foo in); end" parses "{% unless 1; 2; else 3; end %}" parses "{% unless 1; 2; else 3; end %}" says syntax error on "@@foo :: Foo" says syntax error on "@@foo :: Foo" parses "foo(n + 2)" parses "foo(n + 2)" parses "lib LibC; type A = B*; end" parses "lib LibC; type A = B*; end" parses "class Foo\ndef foo; end; end" parses "class Foo\ndef foo; end; end" parses "a = 1; a += 1" parses "a = 1; a += 1" parses "foo(&.as?(T))" parses "foo(&.as?(T))" says syntax error on "def foo(foo include); end" says syntax error on "def foo(foo include); end" parses "def foo(var : Char[256]); end" parses "def foo(var : Char[256]); end" parses "def foo(x @@return); end" parses "def foo(x @@return); end" parses "macro foo;var unless true;end" parses "macro foo;var unless true;end" parses "foo = 1; foo -1" parses "foo = 1; foo -1" says syntax error on "def foo(while); end" says syntax error on "def foo(while); end" parses "asm(\"nop\" : : )" parses "asm(\"nop\" : : )" 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 "property class : Int32" parses "property class : Int32" parses "def -; end;" parses "def -; end;" parses "->(x : Int32) { x }" parses "->(x : Int32) { x }" says syntax error on "foo { |(abstract)| }" says syntax error on "foo { |(abstract)| }" says syntax error on "return >= 1" says syntax error on "return >= 1" says syntax error on "def foo(foo next); end" says syntax error on "def foo(foo next); end" parses "def foo(@pointerof); end" parses "def foo(@pointerof); end" says syntax error on "foo **bar, *x" says syntax error on "foo **bar, *x" parses "foo = 1; ->foo./(Int32)" parses "foo = 1; ->foo./(Int32)" parses "a.b &=\n1" parses "a.b &=\n1" says syntax error on "return ^ 1" says syntax error on "return ^ 1" parses "foo.==" parses "foo.==" parses "def foo(@@enum); end" parses "def foo(@@enum); end" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "Foo({X, Y,})" parses "Foo({X, Y,})" parses "{% begin %}%Q( %s ){% end %}" parses "{% begin %}%Q( %s ){% end %}" says syntax error on " [1, 2, 3 end" says syntax error on " [1, 2, 3 end" says syntax error on "macro foo(x y z); end" says syntax error on "macro foo(x y z); end" parses "def /(); end;" parses "def /(); end;" parses "def foo(x @offsetof); end" parses "def foo(x @offsetof); end" says syntax error on "foo { |(x, x)| }" says syntax error on "foo { |(x, x)| }" says syntax error on "def foo(foo typeof); end" says syntax error on "def foo(foo typeof); end" says syntax error on "next >> 1" says syntax error on "next >> 1" parses "1 -\n2" parses "1 -\n2" parses ":<<" parses ":<<" parses "enum : Int32" parses "enum : Int32" parses "foo = 1; ->foo.>=(Int32)" parses "foo = 1; ->foo.>=(Int32)" says syntax error on "def foo(x : U) forall U,; end" says syntax error on "def foo(x : U) forall U,; end" parses "foo(0, n ** 2)" parses "foo(0, n ** 2)" parses "def &; end;" parses "def &; end;" parses "foo %w()" parses "foo %w()" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "class Foo(*T); end" parses "class Foo(*T); end" says syntax error on "def foo(foo with); end" says syntax error on "def foo(foo with); end" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "alias Foo::Bar = Baz" parses "alias Foo::Bar = Baz" parses "a = 1; a ensure a" parses "a = 1; a ensure a" parses "{A::B}" parses "{A::B}" parses ":[]?" parses ":[]?" parses "macro foo;end" parses "macro foo;end" says syntax error on "foo { |(extend)| }" says syntax error on "foo { |(extend)| }" parses "def []=(*args, **opts, &); end" parses "def []=(*args, **opts, &); end" parses "->Foo.&-(Int32)" parses "->Foo.&-(Int32)" parses "foo(0, n * 2)" parses "foo(0, n * 2)" parses "def foo(with foo); end" parses "def foo(with foo); end" parses "(bar do\nend)" parses "(bar do\nend)" parses "def foo(@struct); end" parses "def foo(@struct); end" parses "def &**(); end" parses "def &**(); end" says syntax error on "{1, 2 3}" says syntax error on "{1, 2 3}" parses "case 1\nin nil; 2; end" parses "case 1\nin nil; 2; end" parses ":*" parses ":*" parses "-1.0_f32" parses "-1.0_f32" parses "foo[*baz] = 1" parses "foo[*baz] = 1" parses "{{ foo &.nil? }}" parses "{{ foo &.nil? }}" parses "lib LibC; fun foo : Int**; end" parses "lib LibC; fun foo : Int**; end" parses "x[1, ..2]" parses "x[1, ..2]" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" parses "Foo(\"foo bar\": U)" parses "Foo(\"foo bar\": U)" parses "[] of ->\n1" parses "[] of ->\n1" parses ":\"\\\"foo\"" parses ":\"\\\"foo\"" parses "def foo(@self); end" parses "def foo(@self); end" parses "property include : Int32" parses "property include : Int32" parses "def foo(@@with); end" parses "def foo(@@with); end" says syntax error on "next === 1" says syntax error on "next === 1" parses "foo(out x); x" parses "foo(out x); x" parses "{% for x in y %}body{% end %}" parses "{% for x in y %}body{% end %}" parses "foo(z: 0, a: n &** 2)" parses "foo(z: 0, a: n &** 2)" parses "def foo(x : U) : Int32 forall T, U; end" parses "def foo(x : U) : Int32 forall T, U; end" says syntax error on "foo **bar, out x" says syntax error on "foo **bar, out x" parses "f.x Foo.new" parses "f.x Foo.new" parses "def =~; end" parses "def =~; end" parses "a @b-1\nc" parses "a @b-1\nc" parses "Foo(x: U, y: V)" parses "Foo(x: U, y: V)" parses "def foo(next foo); end" parses "def foo(next foo); end" parses "offsetof(\n Foo,\n @foo\n)" parses "offsetof(\n Foo,\n @foo\n)" parses ":**" parses ":**" end locations 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(x) do; end" gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "@@foo" gets corrects end location for "@@foo" gets corrects end location for ":foo" gets corrects end location for ":foo" gets corrects end location for "foo.nil?( )" gets corrects end location for "foo.nil?( )" sets location of top-level fun name sets location of top-level fun name gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "foo.responds_to?(:foo)" parses "%i((one two))" parses "%i((one two))" 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 "unless 1; 2; end" gets corrects end location for "unless 1; 2; end" gets corrects end location for "[1, 2]" gets corrects end location for "[1, 2]" gets corrects end location for "x : Foo ->" gets corrects end location for "x : Foo ->" gets corrects end location for "foo 1, 2" gets corrects end location for "foo 1, 2" gets corrects end location for "struct Foo; end" gets corrects end location for "struct Foo; end" sets correct location of trailing ensure sets correct location of trailing ensure says syntax error on "def foo(x : 1); end" says syntax error on "def foo(x : 1); end" sets correct location of trailing rescue sets correct location of trailing rescue gets corrects end location for "1.." gets corrects end location for "1.." gets corrects end location for "->{ }" gets corrects end location for "->{ }" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "abstract def foo : Int32" sets correct location for fun def with return type sets correct location for fun def with return type gets corrects end location for "1 rescue 2" gets corrects end location for "1 rescue 2" says syntax error on "case x; when _; end" says syntax error on "case x; when _; end" gets corrects end location for "Int[8]?" gets corrects end location for "Int[8]?" gets corrects end location for "foo *bar" gets corrects end location for "foo *bar" sets correct locations of macro if / else / elsif sets correct locations of macro if / else / elsif 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 "\"hello\"" gets corrects end location for "\"hello\"" says syntax error on "def foo(x\n,y); 1; end" says syntax error on "def foo(x\n,y); 1; end" gets corrects end location for var gets corrects end location for var sets location of lib fun name sets location of lib fun name gets corrects end location for "foo.!" gets corrects end location for "foo.!" parses "%w{one\ttwo}" parses "%w{one\ttwo}" gets corrects end location for "a || b" gets corrects end location for "a || b" parses "%w{one{} two}" parses "%w{one{} two}" gets corrects end location for "module Foo; end" gets corrects end location for "module Foo; end" 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}" parses "annotation Foo\nend\nrequire \"bar\"" parses "annotation Foo\nend\nrequire \"bar\"" parses "%i(foo(bar) baz)" parses "%i(foo(bar) baz)" gets corrects end location for "yield 1" gets corrects end location for "yield 1" says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "{\"a\": 1, \"b\" : 2}" parses "%i{foo\\nbar baz}" parses "%i{foo\\nbar baz}" gets corrects end location for "foo.[0] = 1" gets corrects end location for "foo.[0] = 1" says syntax error on "%q(" says syntax error on "%q(" says syntax error on "def foo(x : (*Int32)); end" says syntax error on "def foo(x : (*Int32)); end" says syntax error on "[1\n,2]" says syntax error on "[1\n,2]" gets corrects end location for "123.45" gets corrects end location for "123.45" gets corrects end location for "abstract def foo" gets corrects end location for "abstract def foo" parses "%w{\n}" parses "%w{\n}" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "return" gets corrects end location for "return" sets correct locations of macro if / elsif sets correct locations of macro if / elsif gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "foo : Foo?" gets corrects end location for "foo : Foo?" gets corrects of ~ gets corrects of ~ gets corrects end location for "foo ->bar=" gets corrects end location for "foo ->bar=" sets location of += sets location of += says syntax error on "{1, 2\n,3}" says syntax error on "{1, 2\n,3}" gets correct location after macro with yield gets correct location after macro with yield gets corrects end location for "a = 123" gets corrects end location for "a = 123" gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "a && b" gets corrects end location for "a && b" 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)" sets correct location and end location of parenthesized empty block sets correct location and end location of parenthesized empty block says syntax error on "%Q(" says syntax error on "%Q(" 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 "'a'" gets corrects end location for "'a'" gets corrects end location for "class Foo; end" gets corrects end location for "class Foo; end" gets corrects end location for "foo **bar" gets corrects end location for "foo **bar" gets corrects end location for "Foo" gets corrects end location for "Foo" gets corrects end location for "foo" gets corrects end location for "foo" 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 "%w(one two)" gets corrects end location for "%w(one two)" 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 "def foo(x : Int32, Int32); end" says syntax error on "def foo(x : Int32, Int32); end" says syntax error on "%w{one}}" says syntax error on "%w{one}}" gets corrects end location for "1.as(Int32)" gets corrects end location for "1.as(Int32)" gets corrects end location for "1 ensure 2" gets corrects end location for "1 ensure 2" sets correct location for fun def sets correct location for fun def says syntax error on "class Foo(X\n,Y); 1; end" says syntax error on "class Foo(X\n,Y); 1; 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" sets correct location of vars in C struct sets correct location of vars in C struct 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 and end location of `begin` block sets correct location and end location of `begin` block 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 "puts obj.foo" gets corrects end location for "puts obj.foo" sets correct location of `elsif` of if statement sets correct location of `elsif` of if statement sets correct location of var in macro for loop sets correct location of var in macro for loop says syntax error on "case x; when 1, _; end" says syntax error on "case x; when 1, _; end" gets corrects end location for "[1, 2,]" gets corrects end location for "[1, 2,]" gets corrects end location for "f.x=(*foo)" gets corrects end location for "f.x=(*foo)" gets corrects end location for var + var gets corrects end location for var + var parses "annotation Foo::Bar\n\nend" parses "annotation Foo::Bar\n\nend" gets corrects end location for "while 1; end" gets corrects end location for "while 1; end" gets corrects end location for "alias Foo = Bar" gets corrects end location for "alias Foo = Bar" correctly computes line number after `\{% ` (#9857) correctly computes line number after `\{% ` (#9857) gets corrects end location for "f.x = foo" gets corrects end location for "f.x = foo" gets correct location with (#1558) gets correct location with (#1558) gets corrects end location for "Foo?" gets corrects end location for "Foo?" gets correct location of empty exception handler inside def gets correct location of empty exception handler inside def gets corrects end location for "return 1" gets corrects end location for "return 1" parses "%i{(one two)}" parses "%i{(one two)}" gets corrects end location for "foo : Foo*" gets corrects end location for "foo : Foo*" 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 "begin; 1; end" gets corrects end location for "begin; 1; end" gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "x : Foo -> Bar" gets corrects end location for "x : Foo -> Bar" says syntax error on "<<-HEREDOC\n" says syntax error on "<<-HEREDOC\n" parses "%w{one\\ two}" parses "%w{one\\ two}" says syntax error on "macro foo(x\n,y); 1; end" says syntax error on "macro foo(x\n,y); 1; end" gets correct location after macro with yield gets correct location after macro with yield says syntax error on "case x; when 1; when _; end" says syntax error on "case x; when 1; when _; end" gets corrects end location for "extend Foo" gets corrects end location for "extend 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 nil; 2; when nil; end" says syntax error on "case x; when nil; 2; when nil; end" sets correct location of var in proc pointer sets correct location of var in proc pointer says syntax error on "<<-HEREDOC" says syntax error on "<<-HEREDOC" says syntax error on "def foo(x : *Int32); end" says syntax error on "def foo(x : *Int32); end" gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "@@a = uninitialized 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" gets corrects end location for "f.x=(foo).bar" gets corrects end location for "f.x=(foo).bar" doesn't override yield with macro yield doesn't override yield with macro yield sets correct location of implicit tuple literal of multi-return sets correct location of implicit tuple literal of multi-return says syntax error on "%x(" says syntax error on "%x(" gets corrects end location for "typeof(1)" gets corrects end location for "typeof(1)" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "%w{{one}" says syntax error on "%w{{one}" gets corrects end location for "require \"foo\"" gets corrects end location for "require \"foo\"" sets correct location of var in type declaration sets correct location of var in type declaration gets corrects end location for block with { ... } gets corrects end location for block with { ... } sets location of obj.x += as call sets location of obj.x += as call gets corrects end location for "foo ->self.bar" gets corrects end location for "foo ->self.bar" sets location of enum method sets location of enum method parses "annotation Foo\n\nend" parses "annotation Foo\n\nend" gets corrects end location for block with do ... end gets corrects end location for block with do ... end gets corrects end location for "!foo" gets corrects end location for "!foo" gets corrects end location for "{} of Int32 => String" gets corrects end location for "{} of Int32 => String" parses "%w{one two}" parses "%w{one two}" gets corrects end location for "foo.!()" gets corrects end location for "foo.!()" parses "%w{one\\}}" parses "%w{one\\}}" parses "%w{one\ntwo}" parses "%w{one\ntwo}" gets corrects end location for "macro foo; 123; end" gets corrects end location for "macro foo; 123; end" gets corrects end location for "foo ->bar" gets corrects end location for "foo ->bar" gets corrects end location for "[] of Int32" gets corrects end location for "[] of Int32" gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "foo ->@@bar.baz" says syntax error on "Foo(X\n,Y)" says syntax error on "Foo(X\n,Y)" sets correct locations of macro if / else sets correct locations of macro if / else says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" gets corrects end location for "include Foo" gets corrects end location for "include Foo" sets correct location and end location of parenthesized block sets correct location and end location of parenthesized block says syntax error on "%i(" says syntax error on "%i(" sets correct location of call name sets correct location of call name 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" 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 "macro foo;end" gets corrects end location for "macro foo;end" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "def foo; 1; end" gets corrects end location for "def foo; 1; end" parses "%w{\\{one}" parses "%w{\\{one}" sets correct location for fun def with body sets correct location for fun def with body gets corrects end location for "1..3" gets corrects end location for "1..3" gets corrects end location for "foo bar, out baz" gets corrects end location for "foo bar, out baz" gets corrects end location for "foo ->Bar.baz" gets corrects end location for "foo ->Bar.baz" says syntax error on "%r(" says syntax error on "%r(" sets correct location for fun def on multiple lines sets correct location for fun def on multiple lines gets corrects end location for "foo.nil?" gets corrects end location for "foo.nil?" gets corrects end location for "false" gets corrects end location for "false" 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 "foo(1, 2)" gets corrects end location for "foo(1, 2)" says syntax error on "{1 => 2\n,3 => 4}" says syntax error on "{1 => 2\n,3 => 4}" 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 "::foo" gets corrects end location for "::foo" gets corrects end location for "foo : Foo[42]" gets corrects end location for "foo : Foo[42]" gets corrects end location for "sizeof(Foo)" gets corrects end location for "sizeof(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 call name in operator assignment sets correct location of call name in operator assignment gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "/foo/" gets corrects end location for "/foo/" gets corrects end location for "def foo; end" gets corrects end location for "def foo; end" sets correct location of element in array literal sets correct location of element in array literal gets corrects end location for "nil" gets corrects end location for "nil" gets corrects end location for "Foo(A)" gets corrects end location for "Foo(A)" gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for "begin; 1; 2; 3; end" 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)" parses "%i(one\\ two)" parses "%i(one\\ two)" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "{1, 2}" gets corrects end location for "{1, 2}" gets corrects end location for "yield" gets corrects end location for "yield" says syntax error on "{1\n,2}" says syntax error on "{1\n,2}" sets correct locations of keywords of exception handler sets correct locations of keywords of exception handler says syntax error on "foo(1\n,2)" says syntax error on "foo(1\n,2)" says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" 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 : Foo.class" gets corrects end location for "foo : Foo.class" gets corrects end location for "Foo { 1 }" gets corrects end location for "Foo { 1 }" gets corrects end location for "foo.@foo" gets corrects end location for "foo.@foo" sets correct location of proc literal sets correct location of proc literal gets corrects end location for "foo ->@bar.baz" gets corrects end location for "foo ->@bar.baz" gets corrects end location for "abstract def foo(x)" gets corrects end location for "abstract def foo(x)" sets correct location of `else` of unless statement sets correct location of `else` of unless statement gets corrects end location for "@foo" gets corrects end location for "@foo" says syntax error on "%w(" says syntax error on "%w(" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" parses "annotation Foo; end" parses "annotation Foo; end" gets corrects end location for "a, b = 1, 2" gets corrects end location for "a, b = 1, 2" says syntax error on "Foo(x: X\n,y: Y)" says syntax error on "Foo(x: X\n,y: Y)" gets corrects end location for "123" gets corrects end location for "123" says syntax error on "{\"a\" : 1}" says syntax error on "{\"a\" : 1}" gets corrects end location for "def foo; rescue ex; end" gets corrects end location for "def foo; rescue ex; end" gets corrects end location for "1 if 2" gets corrects end location for "1 if 2" 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 "%i{one}}" says syntax error on "%i{one}}" sets correct location of `else` of if statement sets correct location of `else` of if statement parses "{% a = 1 if 2 %}" parses "{% a = 1 if 2 %}" says syntax error on "def foo(foo self); end" says syntax error on "def foo(foo self); end" parses "foo ..2" parses "foo ..2" says syntax error on "x, self = 1, 2" says syntax error on "x, self = 1, 2" parses "foo.bar.baz" parses "foo.bar.baz" parses "nil?" parses "nil?" parses "foo(n // 2)" parses "foo(n // 2)" parses "def self.<(); end;" parses "def self.<(); end;" parses "f.x &*= 2" parses "f.x &*= 2" says syntax error on "def foo &block : Int -> Double ; end" says syntax error on "def foo &block : Int -> Double ; end" says syntax error on "macro foo.bar;end" says syntax error on "macro foo.bar;end" parses "def foo(**args : Foo)\n1\nend" parses "def foo(**args : Foo)\n1\nend" parses "Foo(x: U)" parses "Foo(x: U)" parses "lib LibC; fun foo : Int*; end" parses "lib LibC; fun foo : Int*; end" parses "(1)\nif true; end" parses "(1)\nif true; end" parses "def foo(x @typeof); end" parses "def foo(x @typeof); end" says syntax error on "foo { |offsetof| }" says syntax error on "foo { |offsetof| }" parses "/\\ /" parses "/\\ /" says syntax error on "foo { |require| }" says syntax error on "foo { |require| }" says syntax error on "1 ... next" says syntax error on "1 ... next" parses "1 <=> 2" parses "1 <=> 2" parses "lib LibC\nfun getchar : Int\nend" parses "lib LibC\nfun getchar : Int\nend" parses "foo(/ /, / /)" parses "foo(/ /, / /)" parses "def foo; yield 1; yield; end" parses "def foo; yield 1; yield; end" says syntax error on "def foo(foo return); end" says syntax error on "def foo(foo return); end" parses "foo = 1; b = 2; foo +b" parses "foo = 1; b = 2; foo +b" says syntax error on "def foo=(a,b); end" says syntax error on "def foo=(a,b); end" parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo \"foo bar\": 1, \"baz\": 2" parses "n ^ 2" parses "n ^ 2" says syntax error on "a.b, c.d() = 1" says syntax error on "a.b, c.d() = 1" parses "1 unless 3" parses "1 unless 3" parses "while true; 1; end;" parses "while true; 1; end;" says syntax error on "1 .. next" says syntax error on "1 .. next" parses "@[Foo()]" parses "@[Foo()]" parses ":\"\\\\foo\"" parses ":\"\\\\foo\"" parses "def **(); end;" parses "def **(); end;" parses "foo(0, n === 2)" parses "foo(0, n === 2)" says syntax error on "def foo(foo require); end" says syntax error on "def foo(foo require); end" parses "n // 2" parses "n // 2" parses "a = 1; b = 2; c = 3; a-b-c" parses "a = 1; b = 2; c = 3; a-b-c" says syntax error on "break ? 1 : 2" says syntax error on "break ? 1 : 2" parses "def foo(@[Foo] **args); end" parses "def foo(@[Foo] **args); end" says syntax error on "next ? 1 : 2" says syntax error on "next ? 1 : 2" parses "extend : Int32" parses "extend : Int32" parses "def []=(other, file = 1); end" parses "def []=(other, file = 1); end" says syntax error on "def foo(x @@x); 1; end" says syntax error on "def foo(x @@x); 1; end" 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" says syntax error on "macro Foo;end" says syntax error on "macro Foo;end" parses "a = 1; a &-=\n1" parses "a = 1; a &-=\n1" says syntax error on "break < 1" says syntax error on "break < 1" parses "\"\"" parses "\"\"" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "return {1 => 2}" parses "return {1 => 2}" says syntax error on "{a[0]: 1}" says syntax error on "{a[0]: 1}" says syntax error on "break / 1" says syntax error on "break / 1" parses "1.[]=(2, 3)" parses "1.[]=(2, 3)" says syntax error on "break + 1" says syntax error on "break + 1" parses "{1.. => 2};" parses "{1.. => 2};" parses "->Foo.<<(Int32)" parses "->Foo.<<(Int32)" parses "foo 1, a: 1, b: 2\n1" parses "foo 1, a: 1, b: 2\n1" parses "1 ? a : b" parses "1 ? a : b" parses "a = 1; a ^=\n1" parses "a = 1; a ^=\n1" says syntax error on "*a if true = 2" says syntax error on "*a if true = 2" parses "def foo(x = __DIR__); end" parses "def foo(x = __DIR__); end" parses "def foo(x @@false); end" parses "def foo(x @@false); end" says syntax error on "next << 1" says syntax error on "next << 1" says syntax error on "def foo(foo sizeof); end" says syntax error on "def foo(foo sizeof); end" says syntax error on "def foo\nmacro\nend" says syntax error on "def foo\nmacro\nend" parses "2 / 3 + 4 / 5" parses "2 / 3 + 4 / 5" says syntax error on "foo { |(next)| }" says syntax error on "foo { |(next)| }" parses "def foo(@@pointerof); end" parses "def foo(@@pointerof); end" parses ":[]=" parses ":[]=" says syntax error on "def foo 1; end" says syntax error on "def foo 1; end" parses "def =~; end;" parses "def =~; end;" parses "x = 1; foo x {\n}" parses "x = 1; foo x {\n}" parses "private : Int32" parses "private : Int32" parses "a()/3" parses "a()/3" parses ":foo" parses ":foo" says syntax error on "foo { |end| }" says syntax error on "foo { |end| }" parses "def foo(break foo); end" parses "def foo(break foo); end" parses "def foo(x @abstract); end" parses "def foo(x @abstract); end" parses "def foo(fun foo); end" parses "def foo(fun foo); end" parses "def foo(@lib); end" parses "def foo(@lib); end" parses "foo(n - 2)" parses "foo(n - 2)" parses "n / 2" parses "n / 2" says syntax error on "[\n]" says syntax error on "[\n]" parses "def self.*(); end;" parses "def self.*(); end;" parses "foo./" parses "foo./" parses "n - 2" parses "n - 2" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "foo.=~" parses "foo.=~" parses "::foo" parses "::foo" parses "def foo(x, *y : Int32); 1; end" parses "def foo(x, *y : Int32); 1; end" says syntax error on "def as; end" says syntax error on "def as; end" parses "var.@foo.@bar" parses "var.@foo.@bar" parses "a, *b = 1, 2" parses "a, *b = 1, 2" says syntax error on "foo { |(with)| }" says syntax error on "foo { |(with)| }" says syntax error on "*a" says syntax error on "*a" parses "case {1}\nin {nil}; 2; end" parses "case {1}\nin {nil}; 2; end" parses "def foo(@@select); end" parses "def foo(@@select); end" says syntax error on "foo { |break| }" says syntax error on "foo { |break| }" parses "def <=; end;" parses "def <=; end;" says syntax error on "foo { |(until)| }" says syntax error on "foo { |(until)| }" parses "Foo({x: X, y: Y})" parses "Foo({x: X, y: Y})" parses "def foo(@@typeof); end" parses "def foo(@@typeof); end" parses ":&**" parses ":&**" parses "2 * (3 + 4)" parses "2 * (3 + 4)" parses "x([] of Foo, Bar.new)" parses "x([] of Foo, Bar.new)" says syntax error on "foo { |(out)| }" says syntax error on "foo { |(out)| }" parses "{1 =>\n2, 3 =>\n4}" parses "{1 =>\n2, 3 =>\n4}" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" says syntax error on "{{ {% begin %} }}" says syntax error on "{{ {% begin %} }}" parses "def foo(@asm); end" parses "def foo(@asm); end" parses "a.b / 2" parses "a.b / 2" says syntax error on "while break; end" says syntax error on "while break; end" parses "def foo(@@lib); end" parses "def foo(@@lib); end" parses "property alias : Int32" parses "property alias : Int32" parses "1.tap do |x|; 1; rescue; x; end" parses "1.tap do |x|; 1; rescue; x; end" parses "abstract def foo" parses "abstract def foo" says syntax error on "$foo :: Foo" says syntax error on "$foo :: Foo" parses "foo.!~ 1, 2" parses "foo.!~ 1, 2" says syntax error on "next ^ 1" says syntax error on "next ^ 1" parses "{% begin %}%< %s >{% end %}" parses "{% begin %}%< %s >{% end %}" parses "->Foo::Bar::Baz.foo" parses "->Foo::Bar::Baz.foo" parses "Foo(Bar(T | U))" parses "Foo(Bar(T | U))" parses "\"foo\"" parses "\"foo\"" parses "def self.!=; end;" parses "def self.!=; end;" says syntax error on "def foo(break); end" says syntax error on "def foo(break); end" parses "(1; 2; 3)" parses "(1; 2; 3)" says syntax error on "/foo)/" says syntax error on "/foo)/" parses ":-" parses ":-" parses "responds_to?(:foo)" parses "responds_to?(:foo)" parses "a.b **=\n1" parses "a.b **=\n1" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "->@foo.foo!" parses "->@foo.foo!" parses "@@foo = 1" parses "@@foo = 1" parses "foo x, y do\nend" parses "foo x, y do\nend" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "->Foo.>(Int32)" parses "->Foo.>(Int32)" parses "->Foo.<=(Int32)" parses "->Foo.<=(Int32)" says syntax error on "case 1\nin 1; 2" says syntax error on "case 1\nin 1; 2" parses "foo.**(1, 2)" parses "foo.**(1, 2)" parses "foo(&.as(T))" parses "foo(&.as(T))" parses "enum Foo : UInt16; end" parses "enum Foo : UInt16; end" parses "foo %Q" parses "foo %Q" parses "macro foo;%var;end" parses "macro foo;%var;end" parses "puts __FILE__" parses "puts __FILE__" says syntax error on "def foo(foo extend); end" says syntax error on "def foo(foo extend); end" says syntax error on "def foo(foo protected); end" says syntax error on "def foo(foo protected); end" parses "unless foo; 1; else; 2; end" parses "unless foo; 1; else; 2; end" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "/=/" parses "/=/" parses "%r(/)" parses "%r(/)" parses ":foo?" parses ":foo?" says syntax error on "a.b() = 1" says syntax error on "a.b() = 1" parses "->foo" parses "->foo" parses ":!=" parses ":!=" parses "1.as Bar" parses "1.as Bar" parses "foo(1)" parses "foo(1)" parses "/(fo\#{\"bar\"}\#{1}o)/" parses "/(fo\#{\"bar\"}\#{1}o)/" parses "def foo(@[Foo] var : Int32); end" parses "def foo(@[Foo] var : Int32); end" says syntax error on "return &+ 1" says syntax error on "return &+ 1" parses "property pointerof : Int32" parses "property pointerof : Int32" parses "select\nwhen foo\n2\nwhen bar\n4\nend" parses "select\nwhen foo\n2\nwhen bar\n4\nend" parses "foo(bar:a, baz:b)" parses "foo(bar:a, baz:b)" says syntax error on "return 1 foo" says syntax error on "return 1 foo" says syntax error on "foo { |(while)| }" says syntax error on "foo { |(while)| }" parses "def foo(var : Int*); end" parses "def foo(var : Int*); end" says syntax error on "macro foo(x : Int32); end" says syntax error on "macro foo(x : Int32); end" parses "foo &.as?(T)" parses "foo &.as?(T)" parses "case / /; when / /; / /; else; / /; end" parses "case / /; when / /; / /; else; / /; end" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "def foo(x, *y); 1; end" parses "def foo(x, *y); 1; end" parses "-> : Int32 { }" parses "-> : Int32 { }" parses "case :foo; when :bar; 2; end" parses "case :foo; when :bar; 2; end" parses "1 * 2" parses "1 * 2" parses "foo = 1; ->foo.*(Int32)" parses "foo = 1; ->foo.*(Int32)" says syntax error on "return == 1" says syntax error on "return == 1" parses "1 <= 2" parses "1 <= 2" parses "foo(n &- 2)" parses "foo(n &- 2)" parses "foo % q()" parses "foo % q()" parses "next *1, 2" parses "next *1, 2" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" says syntax error on "until return; end" says syntax error on "until return; end" says syntax error on "Foo({x: X, x: Y})" says syntax error on "Foo({x: X, x: Y})" parses "def foo(var1, var2); end" parses "def foo(var1, var2); end" parses "-1.0" parses "-1.0" parses "foo x, *bar" parses "foo x, *bar" parses "{% begin %}%Q[ %s ]{% end %}" parses "{% begin %}%Q[ %s ]{% end %}" says syntax error on "def self.is_a?; end" says syntax error on "def self.is_a?; end" parses "def |(); end" parses "def |(); end" parses "{[] of Foo, Bar::Baz ** 2}" parses "{[] of Foo, Bar::Baz ** 2}" parses "def >(); end;" parses "def >(); end;" says syntax error on "if return; end" says syntax error on "if return; end" parses "foo.&(1, 2) { 3 }" parses "foo.&(1, 2) { 3 }" parses "def foo(@var); 1; end" parses "def foo(@var); 1; end" parses "false : Int32" parses "false : Int32" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "foo(0, n == 2)" parses "foo(0, n == 2)" parses "asm : Int32" parses "asm : Int32" parses "instance_sizeof(X)" parses "instance_sizeof(X)" parses "def ===(*args, **opts); end" parses "def ===(*args, **opts); end" parses "foo.bar.as(Bar)" parses "foo.bar.as(Bar)" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "1 if /x/" parses "1 if /x/" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" parses ":>=" parses ":>=" parses "foo(0, n &* 2)" parses "foo(0, n &* 2)" parses "case {1}\nin {Int32.class}; 2; end" parses "case {1}\nin {Int32.class}; 2; end" parses "def foo(x @struct); end" parses "def foo(x @struct); end" 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 "def []=(value); end" parses "def []=(value); end" says syntax error on "macro foo(**x, **y)" says syntax error on "macro foo(**x, **y)" parses "foo.**" parses "foo.**" parses "{% a = 1 %}" parses "{% a = 1 %}" parses "def //(); end" parses "def //(); end" parses "foo +1.0" parses "foo +1.0" parses "a; unless / /; / /; else; / /; end" parses "a; unless / /; / /; else; / /; end" parses "1 rescue 2" parses "1 rescue 2" says syntax error on "def foo(enum); end" says syntax error on "def foo(enum); end" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" says syntax error on "macro foo&&;end" says syntax error on "macro foo&&;end" parses ":\"foo\"" parses ":\"foo\"" parses "Int[8, 4]" parses "Int[8, 4]" parses "module Foo; end" parses "module Foo; end" says syntax error on "{foo: 1\nbar: 2}" says syntax error on "{foo: 1\nbar: 2}" parses "foo(z: 0, a: n &+ 2)" parses "foo(z: 0, a: n &+ 2)" parses "foo.[0]" parses "foo.[0]" parses "1.as?(Bar)" parses "1.as?(Bar)" parses "def /; end;" parses "def /; end;" parses "->Foo.===(Int32)" parses "->Foo.===(Int32)" parses "foo %w" parses "foo %w" parses "def foo(a, @[Foo] var); end" parses "def foo(a, @[Foo] var); end" parses "def foo(var : (Int, Float -> Double)); end" parses "def foo(var : (Int, Float -> Double)); end" says syntax error on "def foo(macro); end" says syntax error on "def foo(macro); end" parses "x[0] ? 1 : 0" parses "x[0] ? 1 : 0" parses "{% begin %}%x< %s >{% end %}" parses "{% begin %}%x< %s >{% end %}" parses "1;-2" parses "1;-2" parses "def <=(); end;" parses "def <=(); end;" parses "macro foo;%var unless true;end" parses "macro foo;%var unless true;end" parses "foo(0, n ^ 2)" parses "foo(0, n ^ 2)" says syntax error on "return / 1" says syntax error on "return / 1" says syntax error on "select\nwhen 1\n2\nend" says syntax error on "select\nwhen 1\n2\nend" parses "def foo(@@asm); end" parses "def foo(@@asm); end" parses "foo(z: 0, a: n * 2)" parses "foo(z: 0, a: n * 2)" parses "-@foo" parses "-@foo" parses "Foo(T, {x: X})" parses "Foo(T, {x: X})" says syntax error on "foo(foo(&.block)" says syntax error on "foo(foo(&.block)" parses "a.b //=\n1" parses "a.b //=\n1" parses "->Foo.[](Int32)" parses "->Foo.[](Int32)" parses "foo%q" parses "foo%q" says syntax error on "foo { |(enum)| }" says syntax error on "foo { |(enum)| }" parses "def foo(@@sizeof); end" parses "def foo(@@sizeof); end" says syntax error on "foo x: 1, x: 1" says syntax error on "foo x: 1, x: 1" parses "def foo(var : Int32 -> = 1); end" parses "def foo(var : Int32 -> = 1); end" parses "pointerof(\n foo\n)" parses "pointerof(\n foo\n)" parses "foo &.block=(0)" parses "foo &.block=(0)" says syntax error on "break - 1" says syntax error on "break - 1" says syntax error on "def foo(foo fun); end" says syntax error on "def foo(foo fun); end" says syntax error on "break ^ 1" says syntax error on "break ^ 1" says syntax error on "def foo(foo true); end" says syntax error on "def foo(foo true); end" says syntax error on "unless next; end" says syntax error on "unless next; end" sets correct location of annotation in enum sets correct location of annotation in enum parses "f.x |= 2" parses "f.x |= 2" parses "macro foo;bar(end: 1);end" parses "macro foo;bar(end: 1);end" parses "abstract def foo; 1" parses "abstract def foo; 1" says syntax error on "a() += 1" says syntax error on "a() += 1" says syntax error on "return &** 1" says syntax error on "return &** 1" parses "def >; end;" parses "def >; end;" parses ":foo!" parses ":foo!" parses "macro &**;end" parses "macro &**;end" parses "{% begin %}%( %s ){% end %}" parses "{% begin %}%( %s ){% end %}" parses "foo.* 1, 2" parses "foo.* 1, 2" 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" says syntax error on "case break; when 1; end; end" says syntax error on "case break; when 1; end; end" parses "a = 1; class Foo; @x = a; end" parses "a = 1; class Foo; @x = a; end" parses "a = 1; b = 2; c = 3; a-b -c" parses "a = 1; b = 2; c = 3; a-b -c" says syntax error on "foo[next]" says syntax error on "foo[next]" parses "{% if x %}body{% end %}" parses "{% if x %}body{% end %}" parses "{\n1\n}" parses "{\n1\n}" parses "foo()" parses "foo()" parses "a\nwhile / /; / /; end" parses "a\nwhile / /; / /; end" parses "foo do |a|; 1; end" parses "foo do |a|; 1; end" says syntax error on "return.as(Int32)" says syntax error on "return.as(Int32)" parses "1 if 3" parses "1 if 3" parses "{..2}" parses "{..2}" parses "->Foo.>>(Int32)" parses "->Foo.>>(Int32)" parses "n * 2" parses "n * 2" parses "def foo(nil foo); end" parses "def foo(nil foo); end" says syntax error on "lib Foo%end" says syntax error on "lib Foo%end" parses "enum Foo; protected def foo; 1; end; end" parses "enum Foo; protected def foo; 1; end; end" says syntax error on "{1 => 2 3 => 4}" says syntax error on "{1 => 2 3 => 4}" 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 %}" parses "def ==(*args, **opts); end" parses "def ==(*args, **opts); end" says syntax error on "next % 1" says syntax error on "next % 1" 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 "<<-HERE\n \#{1} \#{2}\n HERE" parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "def foo(@out); end" parses "def foo(@out); end" parses "macro >=;end" parses "macro >=;end" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" parses "def foo(@@instance_sizeof); end" parses "def foo(@@instance_sizeof); end" parses "def foo(x @@true); end" parses "def foo(x @@true); end" parses "def <=(*args, **opts); end" parses "def <=(*args, **opts); end" parses "puts {{\n1\n}}" parses "puts {{\n1\n}}" parses "def foo(@@include); end" parses "def foo(@@include); end" parses "def foo(@fun); end" parses "def foo(@fun); end" parses "private def foo; end" parses "private def foo; end" parses "1 &** 2" parses "1 &** 2" parses "macro +;end" parses "macro +;end" says syntax error on "foo { |begin| }" says syntax error on "foo { |begin| }" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "def self.**(); end;" parses "def self.**(); end;" says syntax error on "a = 1, 2, 3" says syntax error on "a = 1, 2, 3" says syntax error on "def foo x y; end" says syntax error on "def foo x y; end" says syntax error on "foo { |private| }" says syntax error on "foo { |private| }" parses "def foo(x = __LINE__); end" parses "def foo(x = __LINE__); end" parses "[1, 2]" parses "[1, 2]" says syntax error on "a.[]() += 1" says syntax error on "a.[]() += 1" parses "break;" parses "break;" parses "nil" parses "nil" parses "def foo(end foo); end" parses "def foo(end foo); end" parses "def <; end;" parses "def <; end;" says syntax error on "A = begin; 1; ensure; B = 1; end" says syntax error on "A = begin; 1; ensure; B = 1; end" parses "def foo(x @@alias); end" parses "def foo(x @@alias); end" says syntax error on " {1, 2, 3 end" says syntax error on " {1, 2, 3 end" parses "->@@foo.foo!" parses "->@@foo.foo!" parses "def foo(@unless); end" parses "def foo(@unless); end" says syntax error on "def foo(foo abstract); end" says syntax error on "def foo(foo abstract); end" says syntax error on "def foo(foo class); end" says syntax error on "def foo(foo class); end" parses "def self.**; end;" parses "def self.**; end;" says syntax error on "def foo(foo macro); end" says syntax error on "def foo(foo macro); end" parses "def foo(@@extend); end" parses "def foo(@@extend); end" says syntax error on "foo { |a b| }" says syntax error on "foo { |a b| }" parses "def &(); end;" parses "def &(); end;" parses "macro foo(**args)\n1\nend" parses "macro foo(**args)\n1\nend" says syntax error on "def foo(pointerof); end" says syntax error on "def foo(pointerof); end" parses "property do : Int32" parses "property do : Int32" parses "break 1, 2" parses "break 1, 2" parses "case 1; end" parses "case 1; end" parses "property sizeof : Int32" parses "property sizeof : Int32" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "def foo(@@module); end" parses "def foo(@@module); end" parses "abstract def foo\n1" parses "abstract def foo\n1" parses "foo &.%(1)" parses "foo &.%(1)" parses "def foo(@@alias); end" parses "def foo(@@alias); end" parses "def self.+(); end;" parses "def self.+(); end;" parses "foo(\n &.block\n)" parses "foo(\n &.block\n)" parses "foo.=== do end" parses "foo.=== do end" parses "@@foo" parses "@@foo" parses "(1 .. )" parses "(1 .. )" parses "def foo(@include); end" parses "def foo(@include); end" parses "[..2]" parses "[..2]" parses "def foo(@@macro); end" parses "def foo(@@macro); end" parses "def foo(&\n); end" parses "def foo(&\n); end" parses "a, b, *c = 1" parses "a, b, *c = 1" says syntax error on "self = 1" says syntax error on "self = 1" says syntax error on "a {} = 1" says syntax error on "a {} = 1" parses "a : Foo = 1" parses "a : Foo = 1" parses "def foo(x @asm); end" parses "def foo(x @asm); end" parses "class Foo(T1); end" parses "class Foo(T1); end" parses "def foo(private foo); end" parses "def foo(private foo); end" parses "def ===(*args, **opts, &); end" parses "def ===(*args, **opts, &); end" parses "def foo(x @@asm); end" parses "def foo(x @@asm); end" parses "lib LibC; Foo = 1; end" parses "lib LibC; Foo = 1; end" parses "def foo(a, & : Int -> Double); end" parses "def foo(a, & : Int -> Double); end" parses "def <(); end" parses "def <(); end" parses "lib LibC; struct Foo; end end" parses "lib LibC; struct Foo; end end" says syntax error on "def foo(select); end" says syntax error on "def foo(select); end" parses "abstract def foo : Int32" parses "abstract def foo : Int32" parses "foo.=~ 1, 2" parses "foo.=~ 1, 2" says syntax error on "def foo(case); end" says syntax error on "def foo(case); end" parses "foo.>= do end" parses "foo.>= do end" parses "case 1; when 1; 2; else; 3; end" parses "case 1; when 1; 2; else; 3; end" parses "->::foo" parses "->::foo" parses "->Foo.foo" parses "->Foo.foo" parses "sizeof(X)" parses "sizeof(X)" says syntax error on "nil foo" says syntax error on "nil foo" parses "foo.[]= 1, 2" parses "foo.[]= 1, 2" parses "foo x do\nend" parses "foo x do\nend" says syntax error on "->() :Int32 { }" says syntax error on "->() :Int32 { }" says syntax error on "def foo\nextend\nend" says syntax error on "def foo\nextend\nend" parses "foo rescue 2" parses "foo rescue 2" parses "def ==(other, file = 1); end" parses "def ==(other, file = 1); end" parses "foo.as(Bar)" parses "foo.as(Bar)" parses "n <= 2" parses "n <= 2" parses "def foo(x @true); end" parses "def foo(x @true); end" parses "def -(); end" parses "def -(); end" parses "foo.<= do end" parses "foo.<= do end" says syntax error on "def foo\nalias\nend" says syntax error on "def foo\nalias\nend" says syntax error on "1 unless next" says syntax error on "1 unless next" sets correct location of global path in class def sets correct location of global path in class def parses "{[] of Foo, Bar::Baz + 2}" parses "{[] of Foo, Bar::Baz + 2}" parses "__DIR__" parses "__DIR__" says syntax error on "foo[1] = return" says syntax error on "foo[1] = return" parses "foo(bar do\nend)" parses "foo(bar do\nend)" parses "def self.!~; end;" parses "def self.!~; end;" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "def ==(); end" parses "def ==(); end" parses "{% begin %}%x| %s |{% end %}" parses "{% begin %}%x| %s |{% end %}" says syntax error on "foo.&&()" says syntax error on "foo.&&()" parses "case 1\nwhen .foo\n2\nend" parses "case 1\nwhen .foo\n2\nend" parses "foo(0, n / 2)" parses "foo(0, n / 2)" parses "foo(1, **bar)" parses "foo(1, **bar)" says syntax error on "foo { |(def)| }" says syntax error on "foo { |(def)| }" parses "->Foo.*(Int32)" parses "->Foo.*(Int32)" parses "->foo=" parses "->foo=" parses "is_a?(Const)" parses "is_a?(Const)" parses "foo.is_a?(Const)" parses "foo.is_a?(Const)" parses "x.foo a: 1, b: 2 " parses "x.foo a: 1, b: 2 " says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" parses "a = 1; a -= 1" parses "a = 1; a -= 1" sets correct location of annotation on method parameter sets correct location of annotation on method parameter parses "Foo({*X, *{Y}})" parses "Foo({*X, *{Y}})" parses "def foo(); 1; rescue; 2; end" parses "def foo(); 1; rescue; 2; end" parses "def self.<; end;" parses "def self.<; end;" parses "{[] of Foo, ::Bar::Baz.new}" parses "{[] of Foo, ::Bar::Baz.new}" parses "-> { }" parses "-> { }" parses "f.x /= 2" parses "f.x /= 2" parses ":==" parses ":==" parses "foo(x, *bar, *baz, y)" parses "foo(x, *bar, *baz, y)" parses "foo.=== 1, 2" parses "foo.=== 1, 2" parses "foo(n >> 2)" parses "foo(n >> 2)" parses "Foo(X: U, Y: V)" parses "Foo(X: U, Y: V)" parses "def self.-; end;" parses "def self.-; end;" parses "def foo;{{@type}};end" parses "def foo;{{@type}};end" parses "@a, b = 1, 2" parses "@a, b = 1, 2" parses "def &+(); end" parses "def &+(); end" parses "->Foo.&(Int32)" parses "->Foo.&(Int32)" parses "foo%i" parses "foo%i" parses "f.x <<= 2" parses "f.x <<= 2" says syntax error on "Foo(T U)" says syntax error on "Foo(T U)" parses "def foo(x @until); end" parses "def foo(x @until); end" parses "def foo(x @in); end" parses "def foo(x @in); end" parses "{% begin %}%[ %s ]{% end %}" parses "{% begin %}%[ %s ]{% end %}" parses "def <<(); end" parses "def <<(); end" parses "foo = 1; ->foo.===(Int32)" parses "foo = 1; ->foo.===(Int32)" says syntax error on "def foo\nfun\nend" says syntax error on "def foo\nfun\nend" parses "foo.%(1, 2) { 3 }" parses "foo.%(1, 2) { 3 }" parses "Foo(\nT,\nU,\n)" parses "Foo(\nT,\nU,\n)" says syntax error on "return &* 1" says syntax error on "return &* 1" parses "foo(0, n <= 2)" parses "foo(0, n <= 2)" says syntax error on "foo { |(sizeof)| }" says syntax error on "foo { |(sizeof)| }" parses ":<" parses ":<" parses "~ 1" parses "~ 1" parses "typeof(1)" parses "typeof(1)" says syntax error on "def foo(out); end" says syntax error on "def foo(out); end" parses "def foo(lib foo); end" parses "def foo(lib foo); end" says syntax error on "foo { |(include)| }" says syntax error on "foo { |(include)| }" parses "Foo(X, offsetof(Foo, @a))" parses "Foo(X, offsetof(Foo, @a))" parses "foo &.!" parses "foo &.!" parses "def foo(@var = 1); 1; end" parses "def foo(@var = 1); 1; end" parses "def foo(x); end; x" parses "def foo(x); end; x" parses "+1.0_f32" parses "+1.0_f32" says syntax error on "*a == 1" says syntax error on "*a == 1" parses "def foo(x @false); end" parses "def foo(x @false); end" says syntax error on "until next; end" says syntax error on "until next; end" parses "a = 1; a &=\n1" parses "a = 1; a &=\n1" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "def foo(@@class); end" parses "def foo(@@class); end" parses "fun : Int32" parses "fun : Int32" says syntax error on "return << 1" says syntax error on "return << 1" says syntax error on "self, x = 1, 2" says syntax error on "self, x = 1, 2" parses "foo(0, n >> 2)" parses "foo(0, n >> 2)" parses "def foo(x @enum); end" parses "def foo(x @enum); end" parses "foo.is_a? Const" parses "foo.is_a? Const" says syntax error on "return false foo" says syntax error on "return false foo" parses "->Foo.>=(Int32)" parses "->Foo.>=(Int32)" parses "property rescue : Int32" parses "property rescue : Int32" parses "foo = 1; b = 2; foo -b" parses "foo = 1; b = 2; foo -b" parses "begin; 1; end;" parses "begin; 1; end;" parses "foo(a: n &** 2)" parses "foo(a: n &** 2)" says syntax error on "foo.||" says syntax error on "foo.||" parses "Foo()?" parses "Foo()?" parses "foo(n << 2)" parses "foo(n << 2)" parses "foo(a: n >= 2)" parses "foo(a: n >= 2)" parses "def foo(x @require); end" parses "def foo(x @require); end" says syntax error on "1 as? Bar" says syntax error on "1 as? Bar" parses "a, b = 1, 2" parses "a, b = 1, 2" says syntax error on "def foo(x @x); 1; end" says syntax error on "def foo(x @x); 1; end" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "n == 2" parses "n == 2" parses "{} of Int32 -> Int32 => Int32" parses "{} of Int32 -> Int32 => Int32" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "def <=(other, file = 1); end" parses "def <=(other, file = 1); end" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "foo.^" parses "foo.^" parses "{[] of Foo, self.foo}" parses "{[] of Foo, self.foo}" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "<<-SOME\n Sa\n Se\n SOME" parses "<<-SOME\n Sa\n Se\n SOME" says syntax error on "next > 1" says syntax error on "next > 1" says syntax error on "1 ? : 2 : 3" says syntax error on "1 ? : 2 : 3" says syntax error on "1 .. break" says syntax error on "1 .. break" parses "foo(a: n ** 2)" parses "foo(a: n ** 2)" parses "a = 1; a += 10 if a += 20" parses "a = 1; a += 10 if a += 20" parses "yield;" parses "yield;" parses ":+" parses ":+" says syntax error on "def self.responds_to?; end" says syntax error on "def self.responds_to?; 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 "lib LibC; union Foo; end end" parses "lib LibC; union Foo; end end" parses "Int[]" parses "Int[]" parses "1 ? a : b ? c : 3" parses "1 ? a : b ? c : 3" says syntax error on "A = B = 1" says syntax error on "A = B = 1" parses "a = 1; a rescue a" parses "a = 1; a rescue a" parses "def self.foo=\n1\nend" parses "def self.foo=\n1\nend" parses "`foo\#{1}bar`" parses "`foo\#{1}bar`" parses "foo(1, **bar, &block)" parses "foo(1, **bar, &block)" parses "@a : Foo = 1" parses "@a : Foo = 1" says syntax error on "foo { |(self)| }" says syntax error on "foo { |(self)| }" parses "1 + /foo/" parses "1 + /foo/" says syntax error on "foo {1, 2}" says syntax error on "foo {1, 2}" parses "def !~(); end" parses "def !~(); end" says syntax error on "a.b {}, c = 1" says syntax error on "a.b {}, c = 1" says syntax error on "Set {1, 2, 3} of Int32" says syntax error on "Set {1, 2, 3} of Int32" says syntax error on "next &* 1" says syntax error on "next &* 1" parses "foo = 1; ->foo.>>(Int32)" parses "foo = 1; ->foo.>>(Int32)" parses "foo 1, **bar, &block" parses "foo 1, **bar, &block" says syntax error on "a, b, *c, d = 1, 2" says syntax error on "a, b, *c, d = 1, 2" parses "/foo/imximx" parses "/foo/imximx" parses "Set(Int32) {1, 2, 3}" parses "Set(Int32) {1, 2, 3}" says syntax error on "def foo; A = 1; end" says syntax error on "def foo; A = 1; end" parses "abstract def foo(x) : Int32" parses "abstract def foo(x) : Int32" parses "x = 0; a, b = x += 1" parses "x = 0; a, b = x += 1" parses "foo(a: n + 2)" parses "foo(a: n + 2)" parses "*a, b = 1" parses "*a, b = 1" says syntax error on "next &+ 1" says syntax error on "next &+ 1" parses "case;when true;1;end" parses "case;when true;1;end" says syntax error on "foo { |select| }" says syntax error on "foo { |select| }" says syntax error on "def self.nil?; end" says syntax error on "def self.nil?; end" parses "foo.|" parses "foo.|" parses "1.is_a?(\n Int32\n)" parses "1.is_a?(\n Int32\n)" parses "def foo(x @sizeof); end" parses "def foo(x @sizeof); end" parses "def foo; with a yield 1; end" parses "def foo; with a yield 1; end" parses "a = 1; a /=\n1" parses "a = 1; a /=\n1" says syntax error on "foo(**bar, 1)" says syntax error on "foo(**bar, 1)" says syntax error on "def foo(if); end" says syntax error on "def foo(if); end" says syntax error on "break % 1" says syntax error on "break % 1" says syntax error on "b? = 1" says syntax error on "b? = 1" says syntax error on "\"foo\" \"bar\"" says syntax error on "\"foo\" \"bar\"" parses "{\n{1}\n}" parses "{\n{1}\n}" parses "a = 1; a /= 1" parses "a = 1; a /= 1" parses "def foo(x @select); end" parses "def foo(x @select); end" parses "foo(*bar)" parses "foo(*bar)" parses "macro **;end" parses "macro **;end" says syntax error on "foo[return]" says syntax error on "foo[return]" parses "def foo(@return); end" parses "def foo(@return); end" parses "def foo(var); end" parses "def foo(var); end" says syntax error on "def foo(**x, &x); end" says syntax error on "def foo(**x, &x); end" parses "1.foo do; 1; end" parses "1.foo do; 1; end" parses "foo(0, n - 2)" parses "foo(0, n - 2)" parses "module Foo(*T); end" parses "module Foo(*T); end" parses "a { |x| x } / b" parses "a { |x| x } / b" parses "def self./; end;" parses "def self./; end;" parses "@[Foo(\"hello\")]" parses "@[Foo(\"hello\")]" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "enum Foo; {{1}}; end" parses "enum Foo; {{1}}; end" parses "break 1 if true" parses "break 1 if true" parses "a = 1; a -=\n1" parses "a = 1; a -=\n1" says syntax error on "foo 1," says syntax error on "foo 1," 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 "macro !=;end" parses "macro !=;end" parses "def foo(@@protected); end" parses "def foo(@@protected); end" parses "foo.< 1, 2" parses "foo.< 1, 2" parses "offsetof : Int32" parses "offsetof : Int32" parses "foo(z: 0, a: n &- 2)" parses "foo(z: 0, a: n &- 2)" parses "if : Int32" parses "if : Int32" parses "foo 1, 2" parses "foo 1, 2" says syntax error on "Foo(T, x: U)" says syntax error on "Foo(T, x: U)" says syntax error on "Foo(x: T y: U)" says syntax error on "Foo(x: T y: U)" parses "def foo; a; end" parses "def foo; a; end" 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 "{% begin %}%i[ %s ]{% end %}" parses "{% begin %}%i[ %s ]{% end %}" parses "Foo(T)?" parses "Foo(T)?" 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 "foo &.&&()" says syntax error on "foo &.&&()" parses "foo(n ** 2)" parses "foo(n ** 2)" parses "{% begin %}%x{ %s }{% end %}" parses "{% begin %}%x{ %s }{% end %}" parses "macro foo(x); 1 + 2; end" parses "macro foo(x); 1 + 2; end" parses "def foo(@[Foo] &@block); end" parses "def foo(@[Foo] &@block); end" parses "def foo; x { |a, *b| b }; end" parses "def foo; x { |a, *b| b }; end" says syntax error on "foo { |(offsetof)| }" says syntax error on "foo { |(offsetof)| }" says syntax error on "foo { |(lib)| }" says syntax error on "foo { |(lib)| }" parses "protected def foo; end" parses "protected def foo; end" parses "def foo(x @def); end" parses "def foo(x @def); end" says syntax error on "class Foo(T, U V)" says syntax error on "class Foo(T, U V)" parses "def foo; a = 1; with a yield a; end" parses "def foo; a = 1; with a yield a; end" parses "def foo(x @@var); end" parses "def foo(x @@var); end" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "2**3**4" parses "2**3**4" parses "foo(*{1})" parses "foo(*{1})" parses "property abstract : Int32" parses "property abstract : Int32" parses "foo.== 1, 2" parses "foo.== 1, 2" parses "foo[] /2" parses "foo[] /2" says syntax error on "macro foo x y; end" says syntax error on "macro foo x y; end" says syntax error on "x--" says syntax error on "x--" parses "foo(a: n | 2)" parses "foo(a: n | 2)" parses "a = 1; a /b" parses "a = 1; a /b" parses "asm(\"bl trap\" :::: \"unwind\")" parses "asm(\"bl trap\" :::: \"unwind\")" parses "<<-HERE\n One\n\n Zero\n HERE" parses "<<-HERE\n One\n\n Zero\n HERE" parses "foo(a: n =~ 2)" parses "foo(a: n =~ 2)" parses "foo.bar=(*baz)" parses "foo.bar=(*baz)" parses "asm(\"nop\" ::::)" parses "asm(\"nop\" ::::)" parses "foo % x()" parses "foo % x()" parses "macro foo(@[Foo] outer inner);end" parses "macro foo(@[Foo] outer inner);end" parses "def foo(@end); end" parses "def foo(@end); end" parses "{[] of Foo, Bar::Baz.new}" parses "{[] of Foo, Bar::Baz.new}" parses "def foo(@@var); end" parses "def foo(@@var); end" parses "def self.*; end;" parses "def self.*; end;" parses "\"hello \\\r\n world\"" parses "\"hello \\\r\n world\"" says syntax error on "a = 1; a += return" says syntax error on "a = 1; a += return" parses "def foo(@@true); end" parses "def foo(@@true); end" parses "select\nwhen foo\n2\nend" parses "select\nwhen foo\n2\nend" parses "def self.<=; end;" parses "def self.<=; end;" parses "begin; 1; rescue; 2; else; 3; end" parses "begin; 1; rescue; 2; else; 3; end" parses "puts __DIR__" parses "puts __DIR__" parses "def self.[]; end" parses "def self.[]; end" parses "def foo(@with); end" parses "def foo(@with); end" says syntax error on "->::foo.foo" says syntax error on "->::foo.foo" parses "@a : Foo | Int32" parses "@a : Foo | Int32" says syntax error on "next ... 1" says syntax error on "next ... 1" parses "foo &.[0]" parses "foo &.[0]" parses "def ==(); end;" parses "def ==(); end;" parses "%r(foo(bar))" parses "%r(foo(bar))" parses "foo(bar:\"a\", baz:\"b\")" parses "foo(bar:\"a\", baz:\"b\")" parses "1.0" parses "1.0" parses "(baz; bar do\nend)" parses "(baz; bar do\nend)" parses "foo = 1; ->foo.<<(Int32)" parses "foo = 1; ->foo.<<(Int32)" says syntax error on "def foo(unless); end" says syntax error on "def foo(unless); end" parses "foo &.block[0]" parses "foo &.block[0]" says syntax error on "break == 1" says syntax error on "break == 1" parses "{% begin %}%r(\\A){% end %}" parses "{% begin %}%r(\\A){% end %}" parses "Foo(\"foo\": U, \"bar\": V)" parses "Foo(\"foo\": U, \"bar\": V)" parses "def Foo::Bar.foo\n1\nend" parses "def Foo::Bar.foo\n1\nend" says syntax error on "return & 1" says syntax error on "return & 1" parses "f.x = Foo.new" parses "f.x = Foo.new" parses "def self.!~(); end;" parses "def self.!~(); end;" says syntax error on "a.[]() = 1" says syntax error on "a.[]() = 1" parses "true" parses "true" parses "foo = 1; ->foo.^(Int32)" parses "foo = 1; ->foo.^(Int32)" parses "do : Int32" parses "do : Int32" parses "foo out _" parses "foo out _" parses "{% x unless 1 %}" parses "{% x unless 1 %}" parses "a = / /" parses "a = / /" parses "def foo(x, **args, &block)\n1\nend" parses "def foo(x, **args, &block)\n1\nend" parses "case 1\nelse\n2\nend" parses "case 1\nelse\n2\nend" parses "def self.!=(); end;" parses "def self.!=(); end;" parses "a = 1; a %= 1" parses "a = 1; a %= 1" parses "lib LibC; {{ 1 }}; end" parses "lib LibC; {{ 1 }}; end" parses "def |; end;" parses "def |; end;" parses "def foo(a, &block : Int, self -> Double); end" parses "def foo(a, &block : Int, self -> Double); end" parses "foo(z: 0, a: n &* 2)" parses "foo(z: 0, a: n &* 2)" parses "{[] of Foo, ::foo}" parses "{[] of Foo, ::foo}" single splats inside container literals says syntax error on "{*a: 1}" says syntax error on "{*a: 1}" parses "[*1, *2]" parses "[*1, *2]" says syntax error on "{*1 => 2}" says syntax error on "{*1 => 2}" parses "Set {*{1} * 2}" parses "Set {*{1} * 2}" parses "[*[*[1]], *[2]]" parses "[*[*[1]], *[2]]" says syntax error on "{1 => 2, *3}" says syntax error on "{1 => 2, *3}" parses "[*1]" parses "[*1]" parses "{1, *2}" parses "{1, *2}" parses "[1, *2, 3, *4, 5]" parses "[1, *2, 3, *4, 5]" parses "{*1 * 2}" parses "{*1 * 2}" parses "{*1}" parses "{*1}" parses "[*1 ** 2]" parses "[*1 ** 2]" 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}" parses "case 1\nwhen {*2}; 3; end" parses "case 1\nwhen {*2}; 3; end" parses "x = {*1}" parses "x = {*1}" 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}" says syntax error on "{a: 1, *2}" says syntax error on "{a: 1, *2}" parses "Set {*1, 2, *3}" parses "Set {*1, 2, *3}" parses "{*1, *2}" parses "{*1, *2}" parses "[1, *2]" parses "[1, *2]" parses "lib LibC\nfun getchar : (->)?\nend" parses "lib LibC\nfun getchar : (->)?\nend" says syntax error on "foo { |x, x| }" says syntax error on "foo { |x, x| }" parses "1 << 2" parses "1 << 2" parses "a = 1; a ^= 1" parses "a = 1; a ^= 1" parses "def foo(*y : *T); 1; end" parses "def foo(*y : *T); 1; end" parses "foo { 1 }" parses "foo { 1 }" says syntax error on "foo { |while| }" says syntax error on "foo { |while| }" says syntax error on "{1 => 2, 3 => 4 5 => 6}" says syntax error on "{1 => 2, 3 => 4 5 => 6}" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "foo **bar" parses "foo **bar" parses "def foo(x @pointerof); end" parses "def foo(x @pointerof); end" says syntax error on "foo { |sizeof| }" says syntax error on "foo { |sizeof| }" says syntax error on "A = begin; 1; rescue; B = 1; end" says syntax error on "A = begin; 1; rescue; B = 1; end" parses "1 -2.0" parses "1 -2.0" parses "asm(\"nop\" \n)" parses "asm(\"nop\" \n)" parses "1 && 2" parses "1 && 2" parses "def self.~(); end;" parses "def self.~(); end;" says syntax error on "break[]" says syntax error on "break[]" parses "{% begin %}%i( %s ){% end %}" parses "{% begin %}%i( %s ){% end %}" parses "a = 1" parses "a = 1" parses ":!~" parses ":!~" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "f.x &-= 2" parses "f.x &-= 2" parses "def foo(x @@unless); end" parses "def foo(x @@unless); end" says syntax error on "(1, 2 3)" says syntax error on "(1, 2 3)" parses "_, *_, _, _ = 1, 2, 3" parses "_, *_, _, _ = 1, 2, 3" parses "def foo; 1; 2; end" parses "def foo; 1; 2; end" parses "f.x -= 2" parses "f.x -= 2" parses "def |(); end;" parses "def |(); end;" parses "foo.|(1, 2)" parses "foo.|(1, 2)" says syntax error on "next == 1" says syntax error on "next == 1" parses "Foo?" parses "Foo?" parses "case 1\nwhen .!()\n2\nend" parses "case 1\nwhen .!()\n2\nend" parses "1 -2" parses "1 -2" parses "def foo(@@var); 1; end" parses "def foo(@@var); 1; end" parses "module : Int32" parses "module : Int32" says syntax error on "def foo(*x, **x); end" says syntax error on "def foo(*x, **x); end" parses "foo(a: n << 2)" parses "foo(a: n << 2)" says syntax error on "{\n\"foo\"\n\"bar\"\n}" says syntax error on "{\n\"foo\"\n\"bar\"\n}" parses "@foo = 1" parses "@foo = 1" parses "def foo(class foo); end" parses "def foo(class foo); end" parses "foo.%" parses "foo.%" parses "def self.=~; end;" parses "def self.=~; end;" parses "macro foo(a, @[Foo] &block);end" parses "macro foo(a, @[Foo] &block);end" parses "{% begin %}%r{\\A}{% end %}" parses "{% begin %}%r{\\A}{% end %}" parses "property instance_sizeof : Int32" parses "property instance_sizeof : Int32" parses "1 ** 2" parses "1 ** 2" parses "foo.& do end" parses "foo.& do end" says syntax error on "def self.!; end" says syntax error on "def self.!; end" says syntax error on "def Foo(Int32).bar;end" says syntax error on "def Foo(Int32).bar;end" says syntax error on "foo { |x, (x)| }" says syntax error on "foo { |x, (x)| }" says syntax error on "foo { |(select)| }" says syntax error on "foo { |(select)| }" parses "foo unless 3" parses "foo unless 3" parses "a.b <<=\n1" parses "a.b <<=\n1" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\" : \"volatile\", \"alignstack\", \"intel\")" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\" : \"volatile\", \"alignstack\", \"intel\")" says syntax error on "a {} += 1" says syntax error on "a {} += 1" parses "a.b /=\n1" parses "a.b /=\n1" parses "Foo({X: X, Y: Y})" parses "Foo({X: X, Y: Y})" parses "def foo(var : self?); end" parses "def foo(var : self?); end" says syntax error on "def foo!=; end" says syntax error on "def foo!=; end" parses "{\"foo\": 1}" parses "{\"foo\": 1}" parses "a = 1; a **=\n1" parses "a = 1; a **=\n1" parses "{%\na = 1\n%}" parses "{%\na = 1\n%}" parses "property fun : Int32" parses "property fun : Int32" parses "property struct : Int32" parses "property struct : Int32" parses "a = 1; a //= 1" parses "a = 1; a //= 1" parses "foo.bar [1]" parses "foo.bar [1]" parses "def foo(@@while); end" parses "def foo(@@while); end" says syntax error on "foo { |(true)| }" says syntax error on "foo { |(true)| }" parses "foo 1" parses "foo 1" parses ":===" parses ":===" parses "def foo(a, &block : -> Double); end" parses "def foo(a, &block : -> Double); end" parses "foo(a: n &- 2)" parses "foo(a: n &- 2)" says syntax error on "a += 1" says syntax error on "a += 1" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "[1] /2" parses "[1] /2" says syntax error on "case 1; when next; end; end" says syntax error on "case 1; when next; end; end" parses "begin; / /; end" parses "begin; / /; end" parses "foo z: out x; x" parses "foo z: out x; x" parses "foo(a: n / 2)" parses "foo(a: n / 2)" says syntax error on "return[0]= 1" says syntax error on "return[0]= 1" parses "macro foo(@[Foo] *args);end" parses "macro foo(@[Foo] *args);end" parses "puts %i(one two)" parses "puts %i(one two)" parses "foo(z: 0, a: n !~ 2)" parses "foo(z: 0, a: n !~ 2)" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" says syntax error on "a = next" says syntax error on "a = next" parses "a b() {}" parses "a b() {}" parses "{{ foo.nil?(foo) }}" parses "{{ foo.nil?(foo) }}" parses "1_i64" parses "1_i64" parses "def foo(@@in); end" parses "def foo(@@in); end" parses "foo.|(1, 2) { 3 }" parses "foo.|(1, 2) { 3 }" 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 "lib LibC\nfun getchar(a : Int)\nend" parses "lib LibC\nfun getchar(a : Int)\nend" says syntax error on "macro as?; end" says syntax error on "macro as?; end" parses "foo.>(1, 2) { 3 }" parses "foo.>(1, 2) { 3 }" parses "def foo; x { |a| a }; end" parses "def foo; x { |a| a }; end" says syntax error on "break.as(Int32)" says syntax error on "break.as(Int32)" parses "__FILE__" parses "__FILE__" says syntax error on "{1, ->{ |x| x } }" says syntax error on "{1, ->{ |x| x } }" parses "enum Foo; macro foo;end; end" parses "enum Foo; macro foo;end; end" parses "a = b = 2" parses "a = b = 2" parses "(bar do\nend)" parses "(bar do\nend)" parses "case 1; when 2 then /foo/; end" parses "case 1; when 2 then /foo/; end" says syntax error on "{1 2}" says syntax error on "{1 2}" parses "foo.[]=(1, 2)" parses "foo.[]=(1, 2)" parses "foo.responds_to? :foo" parses "foo.responds_to? :foo" parses "a = 1; a |=\n1" parses "a = 1; a |=\n1" parses "next 1" parses "next 1" 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(regex: //)" parses "foo(regex: //)" parses "foo.is_a?(Foo | Bar)" parses "foo.is_a?(Foo | Bar)" parses "{% begin %}%i< %s >{% end %}" parses "{% begin %}%i< %s >{% end %}" parses "{{ foo }}" parses "{{ foo }}" says syntax error on "break & 1" says syntax error on "break & 1" parses "foo(1 + 2)" parses "foo(1 + 2)" parses "Foo(X, instance_sizeof(Int32))" parses "Foo(X, instance_sizeof(Int32))" parses "<<-EOF.x\n foo\nEOF" parses "<<-EOF.x\n foo\nEOF" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "typeof : Int32" parses "typeof : Int32" says syntax error on "'''" says syntax error on "'''" parses "macro foo;%var if true;end" parses "macro foo;%var if true;end" parses "def self.%; end;" parses "def self.%; end;" parses "puts %w(one two)" parses "puts %w(one two)" parses "{% begin %}%x( %s ){% end %}" parses "{% begin %}%x( %s ){% end %}" parses "foo.<= 1, 2" parses "foo.<= 1, 2" parses ":foo" parses ":foo" parses "def >(); end" parses "def >(); end" parses "(/ /)" parses "(/ /)" parses "def foo(@@until); end" parses "def foo(@@until); end" says syntax error on "foo { |false| }" says syntax error on "foo { |false| }" parses "{A: 1, B: 2}" parses "{A: 1, B: 2}" says syntax error on "foo { |case| }" says syntax error on "foo { |case| }" parses "foo *{1}" parses "foo *{1}" parses "foo\n .bar" parses "foo\n .bar" parses "a.b ^=\n1" parses "a.b ^=\n1" says syntax error on "next // 1" says syntax error on "next // 1" parses "def foo(x @module); end" parses "def foo(x @module); end" parses "def foo(a, &block : Foo); end" parses "def foo(a, &block : Foo); end" parses "ensure : Int32" parses "ensure : Int32" says syntax error on "def foo @var, █ end" says syntax error on "def foo @var, █ end" parses "foo(0, n + 2)" parses "foo(0, n + 2)" parses "Foo(X, alignof(Int32))" parses "Foo(X, alignof(Int32))" parses "def foo(@@false); end" parses "def foo(@@false); end" parses "macro ==;end" parses "macro ==;end" parses "def foo(pointerof foo); end" parses "def foo(pointerof foo); end" parses "property enum : Int32" parses "property enum : Int32" parses "def foo(x @@include); end" parses "def foo(x @@include); end" parses "def foo(var : Int?); end" parses "def foo(var : Int?); end" parses "def foo(x @if); end" parses "def foo(x @if); end" parses "foo.<=" parses "foo.<=" parses "foo(&.responds_to?(:foo))" parses "foo(&.responds_to?(:foo))" parses "def foo(&); end" parses "def foo(&); end" says syntax error on "macro foo *y;end" says syntax error on "macro foo *y;end" says syntax error on "break[0]= 1" says syntax error on "break[0]= 1" says syntax error on "a.b() += 1" says syntax error on "a.b() += 1" parses "/fo\#{1}o/" parses "/fo\#{1}o/" says syntax error on "next.as(Int32)" says syntax error on "next.as(Int32)" parses "foo *bar" parses "foo *bar" parses "def Foo.foo\n1\nend" parses "def Foo.foo\n1\nend" parses "case 1\nwhen 1\n2\nend" parses "case 1\nwhen 1\n2\nend" parses "module Foo\ndef foo; end; end" parses "module Foo\ndef foo; end; end" parses "foo %x()" parses "foo %x()" parses "a = uninitialized Foo; a" parses "a = uninitialized Foo; a" says syntax error on "return[0]" says syntax error on "return[0]" parses "foo.nil?" parses "foo.nil?" parses "foo[\n1\n]" parses "foo[\n1\n]" parses "\"hello \"\\\n\"world\"" parses "\"hello \"\\\n\"world\"" parses "foo.=~(1, 2)" parses "foo.=~(1, 2)" parses "@a : Foo" parses "@a : Foo" says syntax error on "def foo=(**kwargs); end" says syntax error on "def foo=(**kwargs); end" says syntax error on "foo { |(case)| }" says syntax error on "foo { |(case)| }" says syntax error on "foo { |pointerof| }" says syntax error on "foo { |pointerof| }" parses "property ensure : Int32" parses "property ensure : Int32" says syntax error on "foo { |in| }" says syntax error on "foo { |in| }" parses "break 1" parses "break 1" parses "foo = 1; ->foo.[](Int32)" parses "foo = 1; ->foo.[](Int32)" parses "->::Foo.foo!" parses "->::Foo.foo!" parses "def self.foo=()\n1\nend" parses "def self.foo=()\n1\nend" says syntax error on "return[]" says syntax error on "return[]" parses "a = 1; a ||= 1" parses "a = 1; a ||= 1" parses "def foo(&@block); end" parses "def foo(&@block); end" says syntax error on "self += 1" says syntax error on "self += 1" parses "a = 1; a >>=\n1" parses "a = 1; a >>=\n1" says syntax error on "1 if break" says syntax error on "1 if break" parses "foo &.as?(T).bar" parses "foo &.as?(T).bar" parses "foo = 1; foo &x" parses "foo = 1; foo &x" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "foo.| do end" parses "foo.| do end" parses "property private : Int32" parses "property private : Int32" parses "_ = 1" parses "_ = 1" says syntax error on "foo { |struct| }" says syntax error on "foo { |struct| }" parses "{% unless 1; 2; end %}" parses "{% unless 1; 2; end %}" parses "{% begin %}%w{ %s }{% end %}" parses "{% begin %}%w{ %s }{% end %}" parses "foo[0] = 1 if 2" parses "foo[0] = 1 if 2" parses "macro foo(x, *y);end" parses "macro foo(x, *y);end" says syntax error on "def foo(var = 1 : Int32); end" says syntax error on "def foo(var = 1 : Int32); end" parses "foo(\na: 1,\n)" parses "foo(\na: 1,\n)" parses "foo.> 1, 2" parses "foo.> 1, 2" parses "puts {{**1}}" parses "puts {{**1}}" parses "(1 ... )" parses "(1 ... )" parses "foo(n * 2)" parses "foo(n * 2)" says syntax error on "next & 1" says syntax error on "next & 1" parses "1 ^ 2" parses "1 ^ 2" parses "foo = 1; foo +1" parses "foo = 1; foo +1" parses "foo.=~(1, 2) { 3 }" parses "foo.=~(1, 2) { 3 }" parses "foo /;/" parses "foo /;/" parses "<<-FOO\n\t1\n\tFOO" parses "<<-FOO\n\t1\n\tFOO" parses "typeof(a = 1); a" parses "typeof(a = 1); a" says syntax error on "foo { |(struct)| }" says syntax error on "foo { |(struct)| }" parses "lib : Int32" parses "lib : Int32" parses "a = 1; a *= 1" parses "a = 1; a *= 1" parses "foo 1;" parses "foo 1;" says syntax error on "a = break" says syntax error on "a = break" parses "2 * 3 + 4 * 5" parses "2 * 3 + 4 * 5" parses "foo.!~(1, 2) { 3 }" parses "foo.!~(1, 2) { 3 }" says syntax error on "foo[1] = next" says syntax error on "foo[1] = next" parses "foo(n &* 2)" parses "foo(n &* 2)" parses "def foo(@@if); end" parses "def foo(@@if); end" parses "lib LibFoo\nend\nif true\nend" parses "lib LibFoo\nend\nif true\nend" parses "foo.responds_to?(:foo)" parses "foo.responds_to?(:foo)" parses "abstract : Int32" parses "abstract : Int32" parses "macro foo(x = __LINE__);end" parses "macro foo(x = __LINE__);end" parses "def foo(typeof foo); end" parses "def foo(typeof foo); end" says syntax error on "FOO, BAR = 1, 2" says syntax error on "FOO, BAR = 1, 2" parses "foo.+ do end" parses "foo.+ do end" parses "foo a, / /" parses "foo a, / /" parses "foo &.baz.qux do\nend" parses "foo &.baz.qux do\nend" parses "foo.**(1, 2) { 3 }" parses "foo.**(1, 2) { 3 }" parses "def foo(x @self); end" parses "def foo(x @self); end" parses "1 +\n2" parses "1 +\n2" parses "next *{1, 2}" parses "next *{1, 2}" parses "{\n1,\n2\n}" parses "{\n1,\n2\n}" parses "a, b = 1, 2 if 3" parses "a, b = 1, 2 if 3" parses "property module : Int32" parses "property module : Int32" parses "a = 1; a +=\n1" parses "a = 1; a +=\n1" parses "def foo(@protected); end" parses "def foo(@protected); end" parses "abstract def foo(x)" parses "abstract def foo(x)" parses "puts {{*1}}" parses "puts {{*1}}" says syntax error on "def self.as; end" says syntax error on "def self.as; end" parses "{% begin %}%{ %s }{% end %}" parses "{% begin %}%{ %s }{% end %}" says syntax error on "foo { |abstract| }" says syntax error on "foo { |abstract| }" says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "def foo(foo instance_sizeof); end" parses "a = 1\nfoo -a" parses "a = 1\nfoo -a" parses "macro foo\n'\\''\nend" parses "macro foo\n'\\''\nend" parses "foo(a: n - 2)" parses "foo(a: n - 2)" parses "a = 1; a &&= 1" parses "a = 1; a &&= 1" parses "macro foo;if %var;true;end;end" parses "macro foo;if %var;true;end;end" parses ":[]=" parses ":[]=" parses "def foo(x @@sizeof); end" parses "def foo(x @@sizeof); end" parses "4./(2)" parses "4./(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" says syntax error on "def !; end" says syntax error on "def !; end" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "%r(\\ )" parses "%r(\\ )" parses "def foo(x = __FILE__); end" parses "def foo(x = __FILE__); end" parses "macro <=>;end" parses "macro <=>;end" parses "class Foo(Type); end" parses "class Foo(Type); end" parses "def foo(@@return); end" parses "def foo(@@return); end" parses "def foo(x @@pointerof); end" parses "def foo(x @@pointerof); end" parses "foo.===(1, 2) { 3 }" parses "foo.===(1, 2) { 3 }" parses "1.nil?(\n)" parses "1.nil?(\n)" parses "a = 1; a &= 1" parses "a = 1; a &= 1" parses "@foo" parses "@foo" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "foo { |a, b, | 1 }" parses "foo { |a, b, | 1 }" parses "n !~ 2" parses "n !~ 2" parses "next 1, 2" parses "next 1, 2" says syntax error on "foo { |fun| }" says syntax error on "foo { |fun| }" says syntax error on "foo { |(begin)| }" says syntax error on "foo { |(begin)| }" parses "/fo\\so/" parses "/fo\\so/" says syntax error on "def foo(false); end" says syntax error on "def foo(false); end" parses "macro foo\neenum\nend" parses "macro foo\neenum\nend" parses "x.foo(a: 1, b: 2)" parses "x.foo(a: 1, b: 2)" parses "[/ /, / /]" parses "[/ /, / /]" says syntax error on "a, b, c, d, *e = 1, 2, 3" says syntax error on "a, b, c, d, *e = 1, 2, 3" says syntax error on "if break; end" says syntax error on "if break; end" parses "foo x do\n//\nend" parses "foo x do\n//\nend" parses "def foo(@sizeof); end" parses "def foo(@sizeof); end" parses "foo &.as(T)" parses "foo &.as(T)" parses "foo%x" parses "foo%x" parses "property offsetof : Int32" parses "property offsetof : Int32" says syntax error on "fun foo(x : Int32, x : Int64); end" says syntax error on "fun foo(x : Int32, x : Int64); end" says syntax error on "{a: 1, b: 2 c: 3}" says syntax error on "{a: 1, b: 2 c: 3}" parses "-> do end" parses "-> do end" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "foo %q" parses "foo %q" parses "next;" parses "next;" parses "def foo(**args : **Foo)\n1\nend" parses "def foo(**args : **Foo)\n1\nend" parses "{{ 1 // 2 }}" parses "{{ 1 // 2 }}" parses "Foo({X, Y})" parses "Foo({X, Y})" parses "foo = 1; ->foo.[]=(Int32)" parses "foo = 1; ->foo.[]=(Int32)" parses "->() { }" parses "->() { }" parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "macro foo;bar{% if x %}body{% end %}baz;end" says syntax error on " (1, 2, 3 end" says syntax error on " (1, 2, 3 end" 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 "->::Foo.foo?" parses "->::Foo.foo?" parses "/ hi /" parses "/ hi /" parses "def foo(x @class); end" parses "def foo(x @class); end" says syntax error on "a, b.<=" says syntax error on "a, b.<=" parses "+1_i64" parses "+1_i64" parses "foo 1, **bar" parses "foo 1, **bar" parses "<<-HERE\n One\n \n Zero\n HERE" parses "<<-HERE\n One\n \n Zero\n HERE" parses "{% begin %}%r|\\A|{% end %}" parses "{% begin %}%r|\\A|{% end %}" parses "asm(\"nop\" ::)" parses "asm(\"nop\" ::)" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "enum Foo; A = 1; B; end" parses "enum Foo; A = 1; B; end" parses "foo.!= do end" parses "foo.!= do end" says syntax error on "break | 1" says syntax error on "break | 1" parses "->Foo.&**(Int32)" parses "->Foo.&**(Int32)" parses "foo + 1" parses "foo + 1" parses "foo = 1; ->foo.-(Int32)" parses "foo = 1; ->foo.-(Int32)" says syntax error on "next[0]= 1" says syntax error on "next[0]= 1" parses "foo &.[0] = 1" parses "foo &.[0] = 1" says syntax error on "Foo(T, U V)" says syntax error on "Foo(T, U V)" parses "property asm : Int32" parses "property asm : Int32" parses "macro x\n%{}\nend" parses "macro x\n%{}\nend" says syntax error on "def foo &block ; end" says syntax error on "def foo &block ; end" parses "include Foo\nif true; end" parses "include Foo\nif true; end" says syntax error on "def foo(foo out); end" says syntax error on "def foo(foo out); end" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "foo[0] = 1" parses "foo[0] = 1" says syntax error on "1 .. return" says syntax error on "1 .. return" says syntax error on "def foo(foo struct); end" says syntax error on "def foo(foo struct); end" parses "instance_sizeof(\n Int32\n)" parses "instance_sizeof(\n Int32\n)" parses "1 & 2" parses "1 & 2" says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "def foo(foo private); end" says syntax error on "def foo(foo private); end" says syntax error on "def foo(foo module); end" says syntax error on "def foo(foo module); end" 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 "foo(a: n > 2)" parses "foo(a: n > 2)" says syntax error on "fun foo\nclass" says syntax error on "fun foo\nclass" parses "a = 1; a &*= 1" parses "a = 1; a &*= 1" says syntax error on "macro foo x\n 1 + 2; end" says syntax error on "macro foo x\n 1 + 2; end" parses "n % 2" parses "n % 2" says syntax error on "foo { |(unless)| }" says syntax error on "foo { |(unless)| }" 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 "foo.!~ do end" parses "foo.!~ do end" says syntax error on "foo(\"bar\" \"baz\")" says syntax error on "foo(\"bar\" \"baz\")" parses "def foo; yield 1; end" parses "def foo; yield 1; end" parses "yield : Int32" parses "yield : Int32" parses "foo.[0] = 1" parses "foo.[0] = 1" parses "def ^(); end" parses "def ^(); end" parses "foo(z: 0, a: n // 2)" parses "foo(z: 0, a: n // 2)" parses "def foo(@@break); end" parses "def foo(@@break); end" parses "def foo(x @@typeof); end" parses "def foo(x @@typeof); end" parses "def `(cmd); 1; end" parses "def `(cmd); 1; end" parses "break *1" parses "break *1" parses "puts %w{one two}" parses "puts %w{one two}" parses "1 &- 2" parses "1 &- 2" parses "*a.foo, a.bar = 1" parses "*a.foo, a.bar = 1" parses "foo%w" parses "foo%w" parses "def >=(*args, **opts, &); end" parses "def >=(*args, **opts, &); end" parses "1 >> 2" parses "1 >> 2" parses "case {1}\nin {.bar?}; 2; end" parses "case {1}\nin {.bar?}; 2; end" Semantic: not filters types inside if/else filters types inside if/else types not types not doesn't restrict and doesn't restrict and filters types with !is_a? filters types with !is_a? types not as NoReturn if exp is NoReturn types not as NoReturn if exp is NoReturn filters types inside if filters types inside if doesn't restrict and in while (#4243) doesn't restrict and in while (#4243) Normalize: hash literal normalizes non-empty with of normalizes non-empty with of hoists complex element expressions hoists complex element expressions hoists complex element expressions, hash-like hoists complex element expressions, hash-like hoists complex element expressions, hash-like generic hoists complex element expressions, hash-like generic normalizes empty with of normalizes empty with of normalizes non-empty without of normalizes non-empty without of Code gen: var codegens bug with var, while, if, break and ssa codegens bug with var, while, if, break and ssa codegens bug with union of int, nil and string (1): assigning nil to union must fill all zeros codegens bug with union of int, nil and string (1): assigning nil to union must fill all zeros codegens var codegens var works with typeof with assignment (#828) works with typeof with assignment (#828) assigns to underscore assigns to underscore codegens var with type declaration codegens var with type declaration codegens ivar assignment when not-nil type filter applies codegens ivar assignment when not-nil type filter applies codegens assignment that can never be reached codegens assignment that can never be reached codegens bug with union of int, nil and string (2): assigning nil to union must fill all zeros codegens bug with union of int, nil and string (2): assigning nil to union must fill all zeros codegens bug with instance vars and ssa codegens bug with instance vars and ssa Semantic: module finds class method in block finds class method in block 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 finds inner class from inherited one (#476) finds inner class from inherited one (#476) gives error with cyclic include between non-generic and generic module gives error with cyclic include between non-generic and generic module instantiates generic variadic module, accesses T from instance method instantiates generic variadic module, accesses T from instance method includes module in a class includes module in a class includes module but not generic includes module but not generic errors when extending module that defines instance vars (2) (#4065) errors when extending module that defines instance vars (2) (#4065) errors if reopening non-generic module as generic errors if reopening non-generic module as generic finds nested type inside method in block inside module finds nested type inside method in block inside module includes generic module explicitly and errors includes generic module explicitly and errors uses type declaration inside module, recursive, and gives error uses type declaration inside module, recursive, and gives error gives error when trying to instantiate with new gives error when trying to instantiate with new gives error with cyclic include gives error with cyclic include 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) extends generic module from generic module and calls class method (#7167) extends generic module from generic module and calls class method (#7167) includes generic module with another generic type includes generic module with another generic type 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 initializes variable in module initializes variable in module 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 and finds type var (2) calls super on included generic module and finds type var (2) includes module but can't access metaclass methods includes module but can't access metaclass methods doesn't look up initialize past module that defines initialize (#7007) doesn't look up initialize past module that defines initialize (#7007) includes generic module with self (check return subclass type, error) includes generic module with self (check return subclass type, error) gives error with cyclic include between non-generic and generic module (2) gives error with cyclic include between non-generic and generic module (2) types proc of module after type changes types proc of module after type changes errors if reopening generic module with different splat index errors if reopening generic module with different splat index includes but not a module includes but not a module extends self extends self uses type declaration inside module uses type declaration inside module inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete uses :Module name for modules in errors uses :Module name for modules in errors inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete reports can't use instance variables inside module reports can't use instance variables inside module errors when extending self and self defines instance vars (#9568) errors when extending self and self defines instance vars (#9568) gives error with cyclic include, generic module gives error with cyclic include, generic module types proc of module with generic class types proc of module with generic class works with int including enumerable works with int including enumerable gives error when including instantiation of self, generic module gives error when including instantiation of self, generic module inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T errors if reopening generic module with different type vars errors if reopening generic module with different type vars instantiates generic variadic module, accesses T from class method instantiates generic variadic module, accesses T from class method declares module automatically if not previously declared when declaring a class declares module automatically if not previously declared when declaring a class types pointer of module with generic type types pointer of module with generic type instantiates generic variadic module, accesses T from instance method through generic include instantiates generic variadic module, accesses T from instance method through generic include types union of module and class that includes it types union of module and class that includes it instantiates generic variadic module, accesses T from instance method, more args instantiates generic variadic module, accesses T from instance method, more args gives helpful error message when generic type var is missing gives helpful error message when generic type var is missing includes generic module with self (check return type, success) includes generic module with self (check return type, success) errors if declares module inside if errors if declares module inside if type def does not reopen type from parent namespace (#11181) type def does not reopen type from parent namespace (#11181) includes generic module with self (check argument type, error) includes generic module with self (check argument type, error) can use generic module as instance variable type (2) can use generic module as instance variable type (2) includes generic module with self, and inherits it includes generic module with self, and inherits it errors when extending generic module that defines instance vars errors when extending generic module that defines instance vars doesn't lookup type in ancestor when matches in current type (#2982) doesn't lookup type in ancestor when matches in current type (#2982) types pointer of module with method types pointer of module with method includes generic module with self includes generic module with self can't pass module class to virtual metaclass (#6113) can't pass module class to virtual metaclass (#6113) can instantiate generic module can instantiate generic module includes module with Union(T*) includes module with Union(T*) extends a module extends a module gives error when trying to instantiate with allocate gives error when trying to instantiate with allocate can't reopen as class can't reopen as class instantiates generic variadic module, accesses T from class method through generic extend instantiates generic variadic module, accesses T from class method through generic extend initializes variable in module, recursive initializes variable in module, recursive includes generic module with type includes generic module with type includes generic module with self (check return subclass type, success) includes generic module with self (check return subclass type, success) 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) declares module automatically if not previously declared when declaring a module declares module automatically if not previously declared when declaring a module finds constant in generic module included in another module finds constant in generic module included in another module uses type declaration inside module and gives error uses type declaration inside module and gives error types pointer of module types pointer of module types pointer of module with method with two including types types pointer of module with method with two including types finds types close to included module finds types close to included module allows overloading with included generic module allows overloading with included generic module errors if reopening generic module with different splat index (2) errors if reopening generic module with different splat index (2) errors if reopening generic module with different splat index (3) errors if reopening generic module with different splat index (3) errors when extending self and self defines instance vars (3) (#9568) errors when extending self and self defines instance vars (3) (#9568) errors if reopening generic module with different type vars (2) errors if reopening generic module with different type vars (2) extends module from generic class and calls class method (#7167) extends module from generic class and calls class method (#7167) includes generic module explicitly includes generic module explicitly works with range and map works with range and map errors when recursively extending module that defines instance vars errors when recursively extending module that defines instance vars can't reopen as struct can't reopen as struct includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) includes module in a module includes module in a module includes generic module and errors in call includes generic module and errors in call includes module but wrong number of arguments includes module but wrong number of arguments includes generic module with self (check return type, error) includes generic module with self (check return type, error) includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) calls super on included generic module and finds type var calls super on included generic module and finds type var errors when extending module that defines instance vars (#4065) errors when extending module that defines instance vars (#4065) errors when recursively extending module that defines instance vars (2) errors when recursively extending module that defines instance vars (2) 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 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) errors when extending generic module that defines instance vars (2) errors when extending generic module that defines instance vars (2) can use generic module as instance variable type can use generic module as instance variable type finds in module when included finds in module when included errors when extending self and self defines instance vars (2) (#9568) errors when extending self and self defines instance vars (2) (#9568) gives error when including self gives error when including self extends generic module from generic class and calls class method (#7167) extends generic module from generic class and calls class method (#7167) includes generic module with self (check argument type, success) includes generic module with self (check argument type, success) Semantic: virtual finds overloads of union of virtual, class and nil with abstract class finds overloads of union of virtual, class and nil with abstract class checks method in every concrete subclass but method in Object checks method in every concrete subclass but method in Object checks cover in every concrete subclass checks cover in every concrete subclass reports undefined method in subclass of abstract class reports undefined method in subclass of abstract class uses virtual type as generic type if class is abstract uses virtual type as generic type if class is abstract doesn't check cover for abstract classes doesn't check cover for abstract classes doesn't check methods on abstract classes 2 doesn't check methods on abstract classes 2 types instance var as virtual when using type declaration and has subclasses types instance var as virtual when using type declaration and has subclasses removes instance var from subclasses removes instance var from subclasses types two subclasses types two subclasses types method call of virtual type types method call of virtual type types inspect types inspect restricts with union and doesn't merge to super type restricts with union and doesn't merge to super type types class and two subclasses types class and two subclasses types method call of virtual type with override types method call of virtual type with override checks cover in every concrete subclass 2 checks cover in every concrete subclass 2 reports missing cover for subclass of abstract class reports missing cover for subclass of abstract class reports no matches for virtual type reports no matches for virtual type 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 classes without a shared virtual types two classes without a shared virtual automatically does virtual for generic type if there are subclasses automatically does virtual for generic type if there are subclasses dispatches virtual method with overload dispatches virtual method with overload works with restriction alpha works with restriction alpha doesn't check cover for subclasses doesn't check cover for subclasses types class and subclass as one type types class and subclass as one type finds overloads of union of virtual, class and nil finds overloads of union of virtual, class and nil checks cover in every concrete subclass 3 checks cover in every concrete subclass 3 dispatches virtual method dispatches virtual method doesn't check methods on abstract classes doesn't check methods on abstract classes Init invocation produces valid yaml file produces valid yaml file honors the custom set directory name honors the custom set directory name prints error if a file is already present prints error if a file is already present doesn't error when asked to skip existing files doesn't error when asked to skip existing files errors if files will be overwritten by a generated file errors if files will be overwritten by a generated file doesn't error if files will be overwritten by a generated file and --force is used doesn't error if files will be overwritten by a generated file and --force is used immutability of returned container literals (#10818) Union#types Union#types ProcNotation#inputs ProcNotation#inputs ProcPointer#args ProcPointer#args MultiAssign#values MultiAssign#values When#conds When#conds MultiAssign#targets MultiAssign#targets Generic#type_vars Generic#type_vars StringInterpolation#expressions StringInterpolation#expressions Annotation#args Annotation#args Crystal::Repl::Interpreter variadic calls promotes float promotes float promotes int promotes int promotes enum promotes enum command expansion expands ldflags expands ldflags Semantic: cast should error if can't cast even if not instantiated should error if can't cast even if not instantiated errors if casting nil to Object inside typeof (#2403) errors if casting nil to Object inside typeof (#2403) doesn't cast to unbound generic type (as?) (#5927) doesn't cast to unbound generic type (as?) (#5927) disallows casting pointer to fun disallows casting pointer to fun allows casting reference union to void pointer allows casting reference union to void pointer casts from union to compatible union casts from union to compatible union doesn't allow upcast of generic type var (#996) doesn't allow upcast of generic type var (#996) can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) 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 casts to same type is ok casts to same type is ok casts to base class making it virtual (2) casts to base class making it virtual (2) casts to module casts to module casts to compatible type and use it casts to compatible type and use it allows casting NoReturn to any type (#2132) allows casting NoReturn to any type (#2132) disallows casting fun to pointer disallows casting fun to pointer disallows casting to Class disallows casting to Class doesn't eagerly try to check cast type (#12268) doesn't eagerly try to check cast type (#12268) casts to base class making it virtual (1) casts to base class making it virtual (1) can cast to metaclass (2) (#11121) can cast to metaclass (2) (#11121) casts uninstantiated generic class to itself (#10882) casts uninstantiated generic class to itself (#10882) disallows casting to Object (#815) disallows casting to Object (#815) can cast to metaclass (bug) can cast to metaclass (bug) casts pointer to another type casts pointer to another type doesn't cast to unbound generic type (as) (#5927) doesn't cast to unbound generic type (as) (#5927) disallows casting to Reference disallows casting to Reference casts to bigger union casts to bigger union casts pointer of one type to another type casts pointer of one type to another type doesn't error if casting to a generic type doesn't error if casting to a generic type allows casting object to void pointer allows casting object to void pointer casts to incompatible type gives error casts to incompatible type gives error casts from union to incompatible union gives error casts from union to incompatible union gives error 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 to generic virtual type casts to generic virtual type considers else to be unreachable (#9658) considers else to be unreachable (#9658) doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) disallows casting int to pointer disallows casting int to pointer doesn't cast to virtual primitive (bug) doesn't cast to virtual primitive (bug) Semantic: uninitialized errors if declares var and then assigns other type errors if declares var and then assigns other type disallows declaring var of type Reference disallows declaring var of type Reference 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 Value disallows declaring var of type Value declares as uninitialized declares as uninitialized has type (#3641) has type (#3641) disallows declaring var of type Int disallows declaring var of type Int uses virtual type for uninitialized (#8216) uses virtual type for uninitialized (#8216) disallows declaring var of type Float disallows declaring var of type Float disallows declaring var of type Enum disallows declaring var of type Enum 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 errors if declaring variable multiple times with different types (#917) errors if declaring variable multiple times with different types (#917) disallows declaring var of type Class disallows declaring var of type Class can use uninitialized with class type (#2940) can use uninitialized with class type (#2940) errors if declaring generic type without type vars (with class var) errors if declaring generic type without type vars (with class var) can uninitialize variable outside initialize, generic (#2828) can uninitialize variable outside initialize, generic (#2828) disallows declaring var of type Struct disallows declaring var of type Struct can uninitialize variable outside initialize (#2828) can uninitialize variable outside initialize (#2828) disallows declaring var of type Object disallows declaring var of type Object declares as uninitialized and reads it declares as uninitialized and reads it works with uninitialized NoReturn (#3314) works with uninitialized NoReturn (#3314) Code gen: and codegens and with bool false and false codegens and with bool false and false codegens assign in right node, after must be nilable codegens assign in right node, after must be nilable codegens and with bool union as left node 4 codegens and with bool union as left node 4 codegens and with nil union as left node 1 codegens and with nil union 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 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 1 codegens and with bool union as left node 1 codegens and with bool union as left node 3 codegens and with bool union as left node 3 codegens and with bool and int 1 codegens and with bool and int 1 codegens assign in right node, after if must be nilable codegens assign in right node, after if must be nilable codegens and with nil union as left node 2 codegens and with nil union as left node 2 codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with primitive type other than bool with union codegens and with primitive type other than bool with union codegens and with bool true and false codegens and with bool true and false codegens and with nilable as left node 1 codegens and with nilable as left node 1 codegens and with non-false union as left node codegens and with non-false union as left node codegens and with bool false and true codegens and with bool false and true codegens and with bool true and true codegens and with bool true and true codegens and with bool 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 bool union as left node 2 codegens and with bool and int 2 codegens and with bool and int 2 file_exists? with relative path reads file (exists) reads file (exists) reads file (doesn't exist) reads file (doesn't exist) with absolute path returns false if file doesn't exist returns false if file doesn't exist returns true if file exists returns true if file exists Code gen: asm passes correct string length to LLVM passes correct string length to LLVM codegens with intel dialect codegens with intel dialect codegens with two outputs codegens with two outputs codegens without inputs codegens without inputs codegens with two inputs codegens with two inputs codegens with one input codegens with one input Parser warnings 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 warns on suffix-less UInt64 literals > Int64::MAX warns on suffix-less UInt64 literals > Int64::MAX Code gen: block codegens while/break inside block codegens while/break inside block codegens block call when argument type changes codegens block call when argument type changes codegens nested break codegens nested break codegens block bug with conditional next and unconditional break (1) codegens block bug with conditional next and unconditional break (1) codegens block bug with conditional next and unconditional break (2) codegens block bug with conditional next and unconditional break (2) 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 yields inside yield (#682) yields inside yield (#682) allow return from function called from yielder function allow return from function called from yielder function codegens block with union arg (2) codegens block with union arg (2) codegens block bug with conditional next and unconditional break (3) codegens block bug with conditional next and unconditional break (3) 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) clears nilable var before inlining block method (#10087) clears nilable var before inlining block method (#10087) passes yield arguments passes yield arguments 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 codegens block with nilable type with return (1) codegens block with nilable type with return (1) yields splat yields splat break from block returns from yielder break from block returns from yielder 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) codegens captured block with next inside yielded block (#2097) codegens captured block with next inside yielded block (#2097) can access instance vars from yielder function can access instance vars from yielder function allows using var as block arg with outer var allows using var as block arg with outer var pass self and arguments to yielder function pass self and arguments to yielder function doesn't crash on yield exp without a type (#8100) doesn't crash on yield exp without a type (#8100) doesn't codegen after while that always yields and breaks doesn't codegen after while that always yields and breaks dispatches with captured and non-captured block (#3969) dispatches with captured and non-captured block (#3969) return from block that always returns from function that conditionally yields return from block that always returns from function that conditionally yields codegens if with call with block (ssa issue) codegens if with call with block (ssa issue) codegens bug with block and arg and var codegens bug with block and arg and var codegens block with nilable type with return (2) codegens block with nilable type with return (2) can call methods from block when yielder is an instance method can call methods from block when yielder is an instance method codegens block with virtual type arg codegens block with virtual type arg break without value returns nil break without value returns nil doesn't codegen call if arg yields and always breaks doesn't codegen call if arg yields and always breaks uses splat in block argument, many args uses splat in block argument, many args doesn't crash if yield exp has no type (#12670) doesn't crash if yield exp has no type (#12670) codegens block which always breaks but never enters (#494) codegens block which always breaks but never enters (#494) codegens call with block with call with arg that yields codegens call with block with call with arg that yields allows modifying yielded value (with literal) allows modifying yielded value (with literal) can set instance vars from yielder function can set instance vars from yielder function unpacks tuple but doesn't override local variables unpacks tuple but doesn't override local variables union value of yielder function union value of yielder function codegens block bug with conditional next and unconditional break (4) codegens block bug with conditional next and unconditional break (4) (bug) doesn't set needs_value to true on every yield (#12442) (bug) doesn't set needs_value to true on every yield (#12442) allows access to local variables allows access to local variables uses block var with same name as local var uses block var with same name as local var 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 codegens block with union with return codegens block with union with return return from yielder function (2) return from yielder function (2) return from yielder function return from yielder function executes yield expression if no arg is given for block executes yield expression if no arg is given for block 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) 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 generate inline generate inline allows initialize with yield (#224) allows initialize with yield (#224) returns from proc literal returns from proc literal uses block splat argument with union types uses block splat argument with union types can break without value from yielder that returns nilable (2) can break without value from yielder that returns nilable (2) nested yields nested yields block with nilable type 2 block with nilable type 2 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 nexts in var assignment (#3364) nexts in var assignment (#3364) can use instance methods from yielder function can use instance methods from yielder function break with value from yielder that returns a nilable break with value from yielder that returns a nilable 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 can break without value from yielder that returns nilable (1) can break without value from yielder that returns nilable (1) block with nilable type block with nilable type codegens call with blocks of different type without args codegens call with blocks of different type without args codegens block with return and yield and no return codegens block with return and yield and no return does next from captured block does next from captured block it yields nil from another call it yields nil from another call codegens block with repeated underscore and different types (#4711) codegens block with repeated underscore and different types (#4711) codegens nested return codegens nested return codegens block with multiple underscores (#3054) codegens block with multiple underscores (#3054) breaks in var assignment (#3364) breaks in var assignment (#3364) can use global constant can use global constant call block from dispatch call block from dispatch assigns yield to argument assigns yield to argument uses splat in block argument uses splat in block argument 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) break from block with value break from block with value codegens block with union arg (1) codegens block with union arg (1) 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 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 returns void when called with block returns void when called with block pass arguments to yielder function pass arguments to yielder function return from block return from block allows modifying yielded value (with variable) allows modifying yielded value (with variable) return from block called from dispatch return from block called from dispatch yields more exps than block arg, through splat yields more exps than block arg, through splat codegens bug with yield not_nil! that is never not nil codegens bug with yield not_nil! that is never not nil auto-unpacks tuple auto-unpacks tuple pass self to yielder function pass self to yielder function allows yield from dispatch call allows yield from dispatch call breaks from while in function called from block breaks from while in function called from block Code gen: lib casts C fun to Crystal proc when accessing instance var (#2515) casts C fun to Crystal proc when accessing instance var (#2515) 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 uses static array in lib extern (#5688) uses static array in lib extern (#5688) allows setting/getting external variable as function pointer allows setting/getting external variable as function pointer 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) doesn't crash with nil and varargs (#4414) doesn't crash with nil and varargs (#4414) refers to lib type (#960) refers to lib type (#960) 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) can use enum as fun return can use enum as fun return allows invoking out with underscore allows invoking out with underscore passes nil to varargs (#1570) passes nil to varargs (#1570) codegens lib var set and get codegens lib var set and get 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 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) 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 can use enum as fun argument can use enum as fun argument call to void function call to void function Normalize: array literal normalizes empty with of normalizes empty with of normalizes non-empty with of normalizes non-empty with of hoists complex element expressions hoists complex element expressions normalizes non-empty without of, with splat normalizes non-empty without of, with splat normalizes non-empty without of, with splat only normalizes non-empty without of, with splat only hoists complex element expressions, array-like hoists complex element expressions, array-like hoists complex element expressions, with splat hoists complex element expressions, with splat normalizes non-empty without of normalizes non-empty without of hoists complex element expressions, array-like generic hoists complex element expressions, array-like generic normalizes non-empty with of, with splat normalizes non-empty with of, with splat Crystal::Repl::Interpreter types discards Path discards Path discards generic discards generic discards class for non-union type discards class for non-union type discards .class discards .class interprets class_crystal_instance_type_id interprets class_crystal_instance_type_id interprets crystal_type_id for non-nil interprets crystal_type_id for non-nil interprets class for non-union type interprets class for non-union type discards class for virtual_type type discards class for virtual_type type interprets crystal_type_id for nil interprets crystal_type_id for nil discards typeof discards typeof interprets path to type interprets path to type interprets class for virtual_type type interprets class for virtual_type type interprets class for virtual_type type (struct) interprets class for virtual_type type (struct) discards crystal_type_id discards crystal_type_id does class method on virtual metaclass casted to generic metaclass (#12302) does class method on virtual metaclass casted to generic metaclass (#12302) interprets crystal_type_id for virtual metaclass type (#12228) interprets crystal_type_id for virtual metaclass type (#12228) interprets class for module type (#12203) interprets class for module type (#12203) Crystal::Repl::Interpreter calls interprets implicit self call for pointer interprets implicit self call for pointer does ReadInstanceVar with wants_struct_pointer does ReadInstanceVar with wants_struct_pointer interprets call with named arguments interprets call with named arguments calls a top-level method without arguments and no local vars calls a top-level method without arguments and no local vars mutates through read instance var mutates through read instance var inlines call that returns self (2) inlines call that returns self (2) 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 Assign class var with wants_struct_pointer does Assign class var with wants_struct_pointer puts struct pointer after tuple indexer puts struct pointer after tuple indexer 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 does call with struct as obj does call with struct as obj inlines method that just reads an instance var (2) inlines method that just reads an instance var (2) does call on instance var that's a struct, from a struct does call on instance var that's a struct, from a struct 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 instance var that's a struct, from a class does call on instance var that's a struct, from a class 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 (2) does call with struct as obj (2) mutates through pointer (3) mutates through pointer (3) mutates through inlined instance var without receiver mutates through inlined instance var without receiver interprets explicit self call for primitive types interprets explicit self call for primitive types 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 call with if interprets call with if does Assign instance var with wants_struct_pointer does Assign instance var with wants_struct_pointer calls a top-level method without arguments but with local vars calls a top-level method without arguments but with local vars inlines call that returns self inlines call that returns self mutates through pointer (1) mutates through pointer (1) does Assign var with wants_struct_pointer does Assign var with wants_struct_pointer 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 interprets call with default values interprets call with default values interprets self for primitive types interprets self for primitive types mutates through pointer (2) mutates through pointer (2) discards call with struct as obj discards call with struct as obj mutates through inlined instance var with receiver mutates through inlined instance var with receiver mutates call argument mutates call argument inlines method that just reads an instance var inlines method that just reads an instance var 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 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 Code gen: primitives codegens bool codegens bool codegens char ord codegens char ord doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) codegens char codegens char codegens f32 codegens f32 codegens string codegens string allows @[Primitive] on method that has body allows @[Primitive] on method that has body codegens int codegens int codegens crystal_type_id with union type codegens crystal_type_id with union type codegens crystal_type_id for class codegens crystal_type_id for class allows redefining a primitive method allows redefining a primitive method 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) gets crystal class instance type id gets crystal class instance type id codegens __LINE__ codegens __LINE__ codegens pointer of int codegens pointer of int arithmetic primitives 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 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 codegens 1 - 2 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 8.unsafe_mod 3 codegens 8.unsafe_mod 3 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 skips bounds checking when to_i produces same type skips bounds checking when to_i produces same type codegens 1 &- 2 codegens 1 &- 2 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.to_i16 codegens 1.to_i16 codegens 1 &+ 2 codegens 1 &+ 2 codegens 8.unsafe_div 3 codegens 8.unsafe_div 3 codegens 16.unsafe_shr 2 codegens 16.unsafe_shr 2 sums two numbers out of an [] of Number sums two numbers out of an [] of Number codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 defined method that calls primitive (bug) defined method that calls primitive (bug) can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) atomicrmw codegens atomicrmw with enums codegens atomicrmw with enums codegens atomicrmw with symbols codegens atomicrmw with symbols codegens atomicrmw with enums codegens atomicrmw with enums can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 passes issue #328 passes issue #328 codegens f64 codegens f64 va_arg uses llvm's va_arg instruction uses llvm's va_arg instruction 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 allows @[Primitive] on fun declarations allows @[Primitive] on fun declarations uses built-in llvm function that returns a tuple uses built-in llvm function that returns a tuple codegens long codegens long .validate_name underscores underscores length length empty empty digits digits invalid character invalid character dashes dashes uppercase uppercase Code gen: hash literal spec creates custom non-generic hash in module creates custom non-generic hash in module creates custom generic hash via alias (1) creates custom generic hash via alias (1) creates custom generic hash with type vars creates custom generic hash with type vars creates custom generic hash creates custom generic hash doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) doesn't crash on hash literal with proc pointer (#646) assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works creates custom generic hash in module (#5684) creates custom generic hash in module (#5684) assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works creates custom generic hash via alias (2) creates custom generic hash via alias (2) creates custom non-generic hash creates custom non-generic hash Block inference doesn't mix local var with block var, using next (#2314) doesn't mix local var with block var, using next (#2314) passes &->f passes &->f allows initialize with yield (#224) allows initialize with yield (#224) doesn't fail with 'already had enclosing call' (#11200) doesn't fail with 'already had enclosing call' (#11200) infer type of yield infer type of yield reports error if yields a type that later changes and that's not that one in the block specification reports error if yields a type that later changes and that's not that one in the block specification reports error if block changes type reports error if block changes type matches block arg return type matches block arg return type reports error on method instantiate (#4543) reports error on method instantiate (#4543) reports mismatch with generic argument type in output type reports mismatch with generic argument type in output type auto-unpacks with block arg type auto-unpacks with block arg type uses block arg, too many parameters uses block arg, too many parameters yields in overload, matches type yields in overload, matches type break without value has nil type break without value has nil type errors if declares extend inside block errors if declares extend inside block infer type of local variable infer type of local variable errors if using ( -> Object) as block return type (#2358) errors if using ( -> Object) as block return type (#2358) respects block arg restriction when block has a splat parameter (#6473) respects block arg restriction when block has a splat parameter (#6473) does next from block without value does next from block without value auto-unpacks tuple, captured block auto-unpacks tuple, captured block infer type of empty block body infer type of empty block body errors if declares class inside captured block errors if declares class inside captured block errors if declares alias inside block errors if declares alias inside block allows underscore in block return type even if the return type can't be computed allows underscore in block return type even if the return type can't be computed errors if proc is not instantiated errors if proc is not instantiated uses splat in block parameter, but not enough yield expressions uses splat in block parameter, but not enough yield expressions finds type inside module in block finds type inside module in block reports error if yields a type that's not that one in the block specification reports error if yields a type that's not that one in the block specification errors if declares class inside block errors if declares class inside block errors if invoking new with block when no initialize is defined errors if invoking new with block when no initialize is defined renders expected block return type of a free variable on mismatch renders expected block return type of a free variable on mismatch allows alias as block fun type allows alias as block fun type errors if declares fun inside block errors if declares fun inside block allows invoking method on a object of a captured block with a type that was never instantiated allows invoking method on a object of a captured block with a type that was never instantiated auto-unpacks tuple, captured block with multiple statements auto-unpacks tuple, captured block with multiple statements errors when using local variable with block parameter name errors when using local variable with block parameter name doesn't crash on #2531 doesn't crash on #2531 errors if yields from top level errors if yields from top level uses splat in block parameter uses splat in block parameter checks block type with virtual type checks block type with virtual type correctly types unpacked tuple block arg after block (#3339) correctly types unpacked tuple block arg after block (#3339) errors if breaks from captured block errors if breaks from captured block passes #233: block with initialize with default args passes #233: block with initialize with default args errors if doing next in proc literal errors if doing next in proc literal errors on recursive yield errors on recursive yield break from block without value break from block without value auto-unpacks tuple, captured empty block auto-unpacks tuple, captured empty block recalculates call that uses block arg output as free var recalculates call that uses block arg output as free var ignores void return type (4) ignores void return type (4) uses free var in return type in captured block uses free var in return type in captured block error with self input type doesn't match error with self input type doesn't match errors if declares def inside block errors if declares def inside block errors if using Object as block return type (#2358) errors if using Object as block return type (#2358) infers type of block before call taking other args free vars into account infers type of block before call taking other args free vars into account does next from block with value 2 does next from block with value 2 yields with different types yields with different types ignores void return type (2) (#427) ignores void return type (2) (#427) reports error if block didn't return expected type reports error if block didn't return expected type yields splat and non splat yields splat and non splat errors if declares module inside block errors if declares module inside block infer type with self block arg infer type with self block arg infer type with union infer type with union unpacks block argument unpacks block argument respects block arg restriction when block has a splat parameter (2) (#9524) respects block arg restriction when block has a splat parameter (2) (#9524) preserves type filters in block preserves type filters in block doesn't auto-unpack tuple, more args doesn't auto-unpack tuple, more args doesn't mix local var with block var, using break (#2314) doesn't mix local var with block var, using break (#2314) can infer block type given that the method has a return type (#7160) can infer block type given that the method has a return type (#7160) errors if using Bar | Object as block return type (#2358) errors if using Bar | Object as block return type (#2358) errors if declares lib inside block errors if declares lib inside block sets captured block type to that of restriction sets captured block type to that of restriction uses splat in block parameter, many args uses splat in block parameter, many args doesn't crash on cleaning up typeof node without dependencies (#8669) doesn't crash on cleaning up typeof node without dependencies (#8669) auto-unpacks tuple, too many args auto-unpacks tuple, too many args auto-unpacks tuple auto-unpacks tuple ignores block parameter if not used ignores block parameter if not used errors if alias is not a fun type errors if alias is not a fun type types bug with yield not_nil! that is never not nil types bug with yield not_nil! that is never not nil reports error if missing arguments to yield reports error if missing arguments to yield uses free var in return type with tuple type uses free var in return type with tuple type auto-unpacks tuple, less than max auto-unpacks tuple, less than max doesn't assign block variable type to last value (#694) doesn't assign block variable type to last value (#694) reports mismatch with generic argument type in input type reports mismatch with generic argument type in input type infer type of block body infer type of block body yields splat yields splat reports error if block type doesn't match reports error if block type doesn't match binds to proc, not only to its body (#1796) binds to proc, not only to its body (#1796) passes #262 passes #262 binds block return type free variable even if there are no block parameters (#1797) binds block return type free variable even if there are no block parameters (#1797) does next from captured block does next from captured block returns from proc literal returns from proc literal errors if declares macro inside block errors if declares macro inside block auto-unpacks tuple, too many args, captured block auto-unpacks tuple, too many args, captured block errors if declares enum inside block errors if declares enum inside block uses block return type as return type, even if can't infer block type uses block return type as return type, even if can't infer block type ignores void return type (#427) ignores void return type (#427) infer type of block parameter infer type of block parameter sets captured block type to that of restriction with alias sets captured block type to that of restriction with alias errors if splat parameter becomes a union errors if splat parameter becomes a union error with self output type doesn't match error with self output type doesn't match types empty block types empty block allows yielding multiple types when a union is expected allows yielding multiple types when a union is expected does next from block with value does next from block with value ignores void return type (3) (#427) ignores void return type (3) (#427) matches block with generic type and free var matches block with generic type and free var types recursive hash assignment types recursive hash assignment uses block var with same name as local var uses block var with same name as local var maps block of union types to union types maps block of union types to union types errors if using (Object ->) as block return type (#2358) errors if using (Object ->) as block return type (#2358) errors on recursive yield with ProcNotation restriction errors on recursive yield with ProcNotation restriction infers type of block before call infers type of block before call errors if returns from captured block errors if returns from captured block infers type of block with generic type infers type of block with generic type auto-unpacks tuple, less than max, captured block auto-unpacks tuple, less than max, captured block reports error if yields a type that's not that one in the block specification reports error if yields a type that's not that one in the block specification errors if declares include inside block errors if declares include inside block errors on recursive yield with non ProcNotation restriction (#6896) errors on recursive yield with non ProcNotation restriction (#6896) Crystal::Repl::Interpreter magic constants does line number does line number constants interprets self inside constant inside class interprets self inside constant inside class returns nil in the assignment returns nil in the assignment hoists constants hoists constants interprets constant literal interprets constant literal interprets complex constant interprets complex constant Crystal::Repl::Interpreter procs 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 discards proc call discards proc call interprets call inside Proc type interprets call inside Proc type can downcast Proc(T) to Proc(Nil) can downcast Proc(T) to Proc(Nil) 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 casts proc call arguments to proc arg types (#12350) casts proc call arguments to proc arg types (#12350) Semantic: multi assign without strict_multi_assign doesn't error if assigning tuple to fewer targets doesn't error if assigning tuple to fewer targets errors if assigning non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) doesn't error if assigning non-Indexable (#11414) doesn't error 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) strict_multi_assign 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 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 non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) errors if assigning tuple to fewer targets errors if assigning tuple to fewer targets errors if assigning non-Indexable (#11414) errors if assigning non-Indexable (#11414) errors if assigning tuple to more targets errors if assigning tuple to more targets Code gen: sizeof gets sizeof Bool (#8272) gets sizeof Bool (#8272) gets sizeof class gets sizeof class can use sizeof in type argument (2) can use sizeof in type argument (2) gets sizeof Nil (#7644) gets sizeof Nil (#7644) gets sizeof NoReturn gets sizeof NoReturn gets sizeof union gets sizeof union can use sizeof of virtual type can use sizeof of virtual type doesn't precompute sizeof of abstract struct (#7741) doesn't precompute sizeof of abstract struct (#7741) can use instance_sizeof in type argument can use instance_sizeof in type argument can use sizeof in type argument (1) can use sizeof in type argument (1) returns correct sizeof for abstract struct (#4319) returns correct sizeof for abstract struct (#4319) can use instance_sizeof of virtual type can use instance_sizeof of virtual type doesn't precompute sizeof of module (#7741) doesn't precompute sizeof of module (#7741) gets instance_sizeof class gets instance_sizeof class gets sizeof Void gets sizeof Void alignof gets alignof union gets alignof union gets alignof struct gets alignof struct gets alignof primitive types gets alignof primitive types alignof mixed union is not less than alignof its variant types alignof mixed union is not less than alignof its variant types gets alignof class gets alignof class gets instance_sizeof a generic type with type vars gets instance_sizeof a generic type with type vars gets sizeof int gets sizeof int gets sizeof struct gets sizeof struct instance_alignof gets instance_alignof a generic type with type vars gets instance_alignof a generic type with type vars gets instance_alignof class gets instance_alignof class implementations find const implementation find const implementation can display json output can display json output find method calls inside trailing if find method calls inside trailing if find implementation inside a module class find implementation inside a module class find full trace for macro expansions find full trace for macro expansions find alias implementation find alias implementation find implementation in class methods find implementation in class methods find top level method calls find top level method calls find method calls inside if find method calls inside if find implementation in generic class find implementation in generic class find class implementation find class implementation find implementation inside contained class' class method find implementation inside contained class' class method can display text output can display text output find method calls inside while find method calls inside while find implementation inside contained file private class' class method find implementation inside contained file private class' class method find method calls inside while cond find method calls inside while cond find implementation from macro expansions find implementation from macro expansions find implementation inside contained file private method find implementation inside contained file private method find implementors of different classes find implementors of different classes find implementors of classes that are only used find implementors of classes that are only used find enum value implementation find enum value implementation find struct implementation find struct implementation find class defined by macro find class defined by macro find open class implementation find open class implementation find module implementation find module implementation find class inside method find class inside method find enum implementation find enum implementation find implementation in generic class methods find implementation in generic class methods find method calls inside rescue find method calls inside rescue 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 named tuple interprets named tuple metaclass indexer interprets named tuple metaclass indexer interprets named tuple literal and access by known index interprets named tuple literal and access by known index discards named tuple (#12383) discards named tuple (#12383) Code gen: closure codegens closure with instance var codegens closure with instance var codegens closure with nested context without new closured vars codegens closure with nested context without new closured vars codegens nested closure with block (2) codegens nested closure with block (2) codegens nested closure codegens nested closure codegens super nested closure with nested closured variable codegens super nested closure with nested closured variable codegen closure in instance method without self closured codegen closure in instance method without self closured codegens closure with block that declares same var codegens closure with block that declares same var codegens closure with instance var and var codegens closure with instance var and var transforms block to proc literal with free var transforms block to proc literal with free var codegens closure with nested context without new closured vars codegens closure with nested context without new closured vars codegens closure with self and arguments codegens closure with self and arguments allows passing an external function along allows passing an external function along 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 codegens nested closure that mentions var in both contexts codegens nested closure that mentions var in both contexts 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 doesn't incorrectly consider local as closured (#4948) doesn't incorrectly consider local as closured (#4948) codegens simple closure at global scope codegens simple closure at global scope codegens multiple nested blocks codegens multiple nested blocks codegens closure with self and var codegens closure with self and var codegens closured self in block (#3388) codegens closured self in block (#3388) allows passing proc literal to def that captures block with & allows passing proc literal to def that captures block with & closures struct self closures struct self codegens super nested closure codegens super nested closure codegens closure with instance var and block codegens closure with instance var and block allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal codegens closure with block codegens closure with block codegens closure with implicit self and var codegens closure with implicit self and var 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 proc literal with struct codegens proc literal with struct codegens closure with def that has an if codegens closure with def that has an if codegens closure with struct codegens closure with struct allows passing an external function along (2) allows passing an external function along (2) unifies types of closured var unifies types of closured var ensures it can raise from the closure check ensures it can raise from the closure check codegens closured nested in block codegens closured nested in block transforms block to proc literal transforms block to proc literal 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 codegens nested closure with nested closured variable codegens nested closure with nested closured variable 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 simple closure in block codegens simple closure in block allows mixing yield and block.call allows mixing yield and block.call 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) codegens simple closure in function codegens simple closure in function 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 simple closure in function with argument codegens simple closure in function with argument allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize Normalize: expressions normalizes an empty expression with begin/end normalizes an empty expression with begin/end normalizes expressions with begin/end normalizes expressions with begin/end normalizes an expression normalizes an expression Semantic: class var can find class var in subclass can find class var in subclass errors if redefining class var type in subclass, with guess errors if redefining class var type in subclass, with guess declares class var in generic module declares class var in generic module types class var types class var types class var as nil if assigned for the first time inside method (#2059) types class var as nil if assigned for the first time inside method (#2059) says undefined class variable says undefined class variable can access constant from generic metaclass (#3719) can access constant from generic metaclass (#3719) errors if redefining class var type in included module errors if redefining class var type in included module types as nilable if doesn't have initializer types as nilable if doesn't have initializer declares class var in generic class declares class var in generic class infers type from T.new infers type from T.new doesn't error if accessing class variable before defined (#2941) doesn't error if accessing class variable before defined (#2941) types class var inside instance method types class var inside instance method infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) gives correct error when trying to use Int as a class variable type gives correct error when trying to use Int as a class variable type allows self.class as type var in class body (#537) allows self.class as type var in class body (#537) allows class var in primitive types (#612) allows class var in primitive types (#612) declares class variable (2) declares class variable (2) errors if class variable not nilable without initializer errors if class variable not nilable without initializer can find class var through included module can find class var through included module errors if using local variable in initializer errors if using local variable in initializer infers type from number literal infers type from number literal declares class variable declares class variable errors if using self as type var but there's no self errors if using self as type var but there's no self can assign to class variable if this type can be up-casted to ancestors class variable type (#4869) can assign to class variable if this type can be up-casted to ancestors class variable type (#4869) redefines class variable type redefines class variable type errors when typing a class variable inside a method errors when typing a class variable inside a method errors if redefining class var type in subclass errors if redefining class var type in subclass doesn't error on recursive dependency if var is nilable (#2943) doesn't error on recursive dependency if var is nilable (#2943) declares uninitialized (#2935) declares uninitialized (#2935) errors when using Class (#2605) errors when using Class (#2605) errors on undefined constant (2) errors on undefined constant (2) types class var inside proc literal inside class types class var inside proc literal inside class errors on undefined constant (1) errors on undefined constant (1) errors if using class variable at the top level errors if using class variable at the top level types class var as nil if not assigned at the top level types class var as nil if not assigned at the top level Code gen: magic constants does __LINE__ with dispatch does __LINE__ with dispatch does __LINE__ does __LINE__ does __LINE__ in macro does __LINE__ in macro does __END_LINE__ with block does __END_LINE__ with block does __LINE__ when specifying one normal default arg does __LINE__ when specifying one normal default arg does __FILE__ in macro does __FILE__ in macro does __END_LINE__ in macro without block does __END_LINE__ in macro without block does __DIR__ in macro does __DIR__ in macro does __LINE__ when specifying one middle argument does __LINE__ when specifying one middle argument does __END_LINE__ in macro with block does __END_LINE__ in macro with block does __FILE__ does __FILE__ does __LINE__ when specifying one default arg with __FILE__ does __LINE__ when specifying one default arg with __FILE__ does __DIR__ does __DIR__ does __END_LINE__ without block does __END_LINE__ without block Crystal::Doc::Macro args_to_s shows splat arg shows splat arg shows double splat arg shows double splat arg shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows default value with highlighting shows default value with highlighting shows simple arg and splat arg shows simple arg and splat arg shows simple arg and double splat arg shows simple arg and double splat arg shows external name of arg shows external name of arg shows block arg shows block arg shows simple args shows simple args shows double splat arg shows double splat arg shows simple arg and block arg shows simple arg and block arg Lexer doc lexes with doc enabled and docs lexes with doc enabled and docs resets doc after non newline or space token resets doc after non newline or space token lexes with doc enabled and docs, two line comment lexes with doc enabled and docs, two line comment lexes with doc enabled and docs, one line comment with two newlines and another comment lexes with doc enabled and docs, one line comment with two newlines and another comment lexes without doc enabled lexes without doc enabled lexes with doc enabled and docs, two line comment with leading whitespace lexes with doc enabled and docs, two line comment with leading whitespace lexes with doc enabled but without docs lexes with doc enabled but without docs Semantic: struct errors if setting closure errors if setting closure errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type errors on empty c struct (#633) errors on empty c struct (#633) errors if already defined with another type (2) errors if already defined with another type (2) errors if includes unknown type errors if includes unknown type errors if invoking to_unsafe and got different type errors if invoking to_unsafe and got different type types struct getter with keyword name types struct getter with keyword name errors on struct if no field errors on struct if no field errors if already defined errors if already defined errors if using void in struct field type errors if using void in struct field type allows inline forward declaration allows inline forward declaration supports macro if inside struct supports macro if inside 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 using void via typedef in struct field type errors if using void via typedef in struct field type types struct getter on pointer type types struct getter on pointer type can access instance var from the outside (#1092) can access instance var from the outside (#1092) errors if includes non-cstruct type errors if includes non-cstruct type automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment types struct getter types struct getter types struct types struct types struct getter to struct types struct getter to struct 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 error in that call errors if invoking to_i32! and got error in that call errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got error in that call types Struct#new types Struct#new errors if includes and field already exists errors if includes and field already exists includes another struct includes another struct marks as packed marks as packed types struct setter types struct setter errors if already defined with another type errors if already defined with another type types struct getter multiple levels via new types struct getter multiple levels via new errors on struct setter if different type errors on struct setter if different type Codegen: thread local works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables works with class variables compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer compiles with class variable referenced from initializer works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread works with class variable in main thread Semantic: responds_to? is bool is bool restricts other types inside if else restricts other types inside if else restricts virtual generic module to including types (#8334) restricts virtual generic module to including types (#8334) restricts virtual generic superclass to subtypes restricts virtual generic superclass to subtypes restricts in assignment restricts in assignment restricts type inside if scope 1 restricts type inside if scope 1 Code gen: virtual type codegens new for simple type, then for virtual codegens new for simple type, then for virtual correctly dispatch call with block when the obj is a virtual type correctly dispatch call with block when the obj is a virtual type casts union to virtual casts union to virtual lookup instance variables in parent types lookup instance variables in parent types calls class method 3 calls class method 3 calls class method 2 calls class method 2 codegens virtual call with explicit self codegens virtual call with explicit self doesn't lookup in Value+ when virtual type is Object+ doesn't lookup in Value+ when virtual type is Object+ codegens non-virtual call that calls virtual call to another virtual call codegens non-virtual call that calls virtual call to another virtual call casts virtual type to union casts virtual type to union 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) 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 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 returns type with virtual type def type returns type with virtual type def type casts virtual type to base virtual type casts virtual type to base virtual type calls class method 1 calls class method 1 codegens virtual call with explicit self and nilable type codegens virtual call with explicit self and nilable type dispatch call with nilable virtual arg dispatch call with nilable virtual arg call overwritten method call overwritten method dispatches on virtual metaclass (3) dispatches on virtual metaclass (3) codegens new twice for virtual codegens new twice for virtual call base method call base method dispatch call with virtual type argument dispatch call with virtual type argument codegens virtual method of abstract metaclass codegens virtual method of abstract metaclass 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 casts metaclass union type to virtual metaclass type (#6298) casts metaclass union type to virtual metaclass type (#6298) codegens allocate for virtual type with custom new codegens allocate for virtual type with custom new dispatches on virtual metaclass (1) dispatches on virtual metaclass (1) 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 call base overwritten method call base overwritten 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 assign instance variable in virtual type assign instance variable in virtual type dispatches on virtual metaclass (2) dispatches on virtual metaclass (2) Code gen: debug inlines instance var access through getter in debug mode inlines instance var access through getter in debug mode has correct debug location after constant initialization in call with block (#4719) has correct debug location after constant initialization in call with block (#4719) 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 (2) stores and restores debug location after jumping to main (2) doesn't fail on constant read calls (#11416) doesn't fail on constant read calls (#11416) 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 stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (3) codegens extern union (#7335) codegens extern union (#7335) doesn't emit incorrect debug info for closured self doesn't emit incorrect debug info for closured self codegens lib union (#7335) codegens lib union (#7335) codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for new with custom allocate (#3945) 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 (#6920) stores and restores debug location after jumping to main (#6920) 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) codegens abstract struct (#3578) codegens abstract struct (#3578) Semantic: previous_def types previous def when inside fun and forwards args types previous def when inside fun and forwards args 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 restrictions types previous def with restrictions types previous def with named arguments, def has double splat parameter (#8895) types previous def with named arguments, def has double splat parameter (#8895) types previous def when inside fun types previous def when inside fun 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 with explicit arguments types previous def with explicit arguments says wrong number of arguments for previous_def (#1223) says wrong number of arguments for previous_def (#1223) 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 with named arguments, def has bare splat parameter (#8895) types previous def with named arguments, def has bare splat parameter (#8895) types previous def in generic class types previous def in generic class errors if there's no previous def errors if there's no previous def types previous def types previous def cleanup errors if assigning var to itself errors if assigning var to itself strip named-tuple elements after unreachable element strip named-tuple elements after unreachable element errors if assigning instance var to itself errors if assigning instance var to itself strip tuple elements after unreachable element strip tuple elements after unreachable element Semantic: special vars infers when assigning inside block infers when assigning inside 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 infers after block infers after block infers $? infers $? errors if assigning $~ at top level errors if assigning $~ at top level 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) 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 in block infers in block Code gen: pointer sets value of pointer to union sets value of pointer to union codegens pointer cast to Nil (#8015) codegens pointer cast to Nil (#8015) codegens nilable pointer type dispatch (2) codegens nilable pointer type dispatch (2) uses correct llvm module for typedef metaclass (#2877) uses correct llvm module for typedef metaclass (#2877) assigns nil and pointer to nilable pointer type assigns nil and pointer to nilable pointer type can assign nil to void pointer can assign nil to void pointer changes through var and reads from pointer changes through var and reads from pointer does pointerof read variable does pointerof read variable codegens nilable pointer type dispatch (1) codegens nilable pointer type dispatch (1) codegens pointer cast codegens pointer cast passes pointer of pointer to method passes pointer of pointer to method codegens nilable pointer type (2) codegens nilable pointer type (2) creates pointer by address creates pointer by address sets value of pointer to struct sets value of pointer to struct get pointer and value of it get pointer and value of it 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 codegens malloc codegens malloc can dereference pointer to func can dereference pointer to func 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 codegens null pointer as if condition codegens null pointer as if condition codegens pointer as if condition inside union (2) codegens pointer as if condition inside union (2) increments pointer increments pointer generates correct code for Pointer.malloc(0) (#2905) generates correct code for Pointer.malloc(0) (#2905) can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call get pointer of instance var get pointer of instance var codegens pointer as if condition codegens pointer as if condition get value of pointer to union get value of pointer to union does pointerof class variable with class does pointerof class variable with class 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 passes arguments correctly for typedef metaclass (#8544) passes arguments correctly for typedef metaclass (#8544) compares pointers through typedef compares pointers through typedef does pointerof class variable does pointerof class variable codegens nilable pointer type (1) codegens nilable pointer type (1) calculates pointer diff calculates pointer diff set pointer value set pointer value 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 codegens realloc codegens realloc can use typedef pointer value get and set (#630) can use typedef pointer value get and set (#630) codegens pointer as if condition inside union (1) codegens pointer as if condition inside union (1) Semantic: c union types union setter via pointer types union setter via pointer types c union types c union types union getter via pointer types union getter via pointer types Union#new types Union#new types union setter types union setter errors if using void via typedef in union field type errors if using void via typedef in union field type errors on empty c union (#633) errors on empty c union (#633) types union getter types union getter errors if using void in union field type errors if using void in union field type errors if setting closure errors if setting closure ASTNode#to_s does to_s of "enum Foo\n A = 0\n B\nend" does to_s of "enum Foo\n A = 0\n B\nend" does to_s of "1[2, x: 3, &.foo]?" does to_s of "1[2, x: 3, &.foo]?" does to_s of "(~1).foo" does to_s of "(~1).foo" does to_s of "lib Foo\n struct Foo\n a : Void\n b : Void\n end\nend" does to_s of "lib Foo\n struct Foo\n a : Void\n b : Void\n end\nend" does to_s of "/a/x" does to_s of "/a/x" does to_s of "macro foo\n {% for foo in bar %}\n {{ foo }}\n {% end %}\nend" does to_s of "macro foo\n {% for foo in bar %}\n {{ foo }}\n {% end %}\nend" does to_s of "case 1; when .!; 2; when .< 0; 3; end" does to_s of "case 1; when .!; 2; when .< 0; 3; end" does to_s of "foo._bar" does to_s of "foo._bar" does to_s of "1[&.foo]?" does to_s of "1[&.foo]?" does to_s of "case 1\nwhen .[](2)\n 3\nwhen .[]=(4)\n 5\nend" does to_s of "case 1\nwhen .[](2)\n 3\nwhen .[]=(4)\n 5\nend" does to_s of "!(1 < 2)" does to_s of "!(1 < 2)" does to_s of "foo(bar)" does to_s of "foo(bar)" does to_s of "{ {1, 2, 3} => 4 }" does to_s of "{ {1, 2, 3} => 4 }" does to_s of `#{::String.interpolation(x)}` does to_s of `#{::String.interpolation(x)}` does to_s of "lib LibFoo\n fun foo(x : (T -> U) | V)\nend" does to_s of "lib LibFoo\n fun foo(x : (T -> U) | V)\nend" does to_s of "foo : A | (B -> C)" does to_s of "foo : A | (B -> C)" does to_s of "return true ? 1 : 2" does to_s of "return true ? 1 : 2" does to_s of "(1 <= 2) <= 3" does to_s of "(1 <= 2) <= 3" does to_s of "macro foo(*, __var var)\nend" does to_s of "macro foo(*, __var var)\nend" does to_s of "foo(x : Foo((T -> U)))" does to_s of "foo(x : Foo((T -> U)))" does to_s of "foo do |k, v|\n k.bar(1, 2, 3)\nend" does to_s of "foo do |k, v|\n k.bar(1, 2, 3)\nend" does to_s of "([] of T).foo" does to_s of "([] of T).foo" does to_s of "(1 + 2).as?(Int32)" does to_s of "(1 + 2).as?(Int32)" does to_s of "macro foo(**args)\nend" does to_s of "macro foo(**args)\nend" does to_s of "(1 + 2).as(Int32)" does to_s of "(1 + 2).as(Int32)" does to_s of "%r()" does to_s of "%r()" does to_s of "fun foo\nend" does to_s of "fun foo\nend" does to_s of "foo(\"bar baz\": 2)" does to_s of "foo(\"bar baz\": 2)" does to_s of "@[Foo(1, 2, a: 1, b: 2)]" does to_s of "@[Foo(1, 2, a: 1, b: 2)]" does to_s of "{(1 + 2) => (3 + 4)}" does to_s of "{(1 + 2) => (3 + 4)}" does to_s of "foo[x : (T -> U) -> V, W] = 1" does to_s of "foo[x : (T -> U) -> V, W] = 1" does to_s of "1.+ do\nend" does to_s of "1.+ do\nend" does to_s of "macro foo\n %bar{1, x} = 1\nend" does to_s of "macro foo\n %bar{1, x} = 1\nend" does to_s of "{% foo %}" does to_s of "{% foo %}" does to_s of "case 1; in .foo?; 2; end" does to_s of "case 1; in .foo?; 2; end" does to_s of "foo(x : (T -> U) -> V, W)" does to_s of "foo(x : (T -> U) -> V, W)" does to_s of "..3" does to_s of "..3" does to_s of "\"\\e\\0\\\"\"" does to_s of "\"\\e\\0\\\"\"" does to_s of "@foo.bar" does to_s of "@foo.bar" does to_s of "/\\?/" does to_s of "/\\?/" does to_s of "{% for foo in bar %}\n {{ if true\n foo\n bar\nend }}\n{% end %}" does to_s of "{% for foo in bar %}\n {{ if true\n foo\n bar\nend }}\n{% end %}" does to_s of "foo &.bar(1, 2, 3)" does to_s of "foo &.bar(1, 2, 3)" does to_s of "{ {1, 2, 3} }" does to_s of "{ {1, 2, 3} }" does to_s of "foo(3, &.*(2))" does to_s of "foo(3, &.*(2))" does to_s of "1.responds_to?(:to_s)" does to_s of "1.responds_to?(:to_s)" does to_s of "macro foo(&)\nend" does to_s of "macro foo(&)\nend" does to_s of "(a = 2) && 1" does to_s of "(a = 2) && 1" does to_s of "foo { |(x, (y, z))| x }" does to_s of "foo { |(x, (y, z))| x }" does to_s of "lib LibFoo\n fun foo(x : (T -> U).class)\nend" does to_s of "lib LibFoo\n fun foo(x : (T -> U).class)\nend" does to_s of "lib LibFoo\n fun foo(x : (T -> U) -> V, W) : ((T -> U) -> V)\nend" does to_s of "lib LibFoo\n fun foo(x : (T -> U) -> V, W) : ((T -> U) -> V)\nend" does to_s of "1.~(2)" does to_s of "1.~(2)" does to_s of "def foo(x : X, @[Foo] y : Y) forall X, Y\nend" does to_s of "def foo(x : X, @[Foo] y : Y) forall X, Y\nend" does to_s of "[(1 + 2)] of Int32" does to_s of "[(1 + 2)] of Int32" does to_s of "macro foo(&block)\nend" does to_s of "macro foo(&block)\nend" does to_s of "1.+(a: 2)" does to_s of "1.+(a: 2)" does to_s of "{ {foo: 2} }" does to_s of "{ {foo: 2} }" does to_s of "{ {1 => 2} }" does to_s of "{ {1 => 2} }" does to_s of "1.+(&block)" does to_s of "1.+(&block)" does to_s of "macro foo(@[Foo] &)\nend" does to_s of "macro foo(@[Foo] &)\nend" does to_s of "if true\n (1)\nend" does to_s of "if true\n (1)\nend" does to_s of "1 && (a = 2)" does to_s of "1 && (a = 2)" does to_s of "foo._bar(1)" does to_s of "foo._bar(1)" does to_s of "macro foo(x)\n yield\nend" does to_s of "macro foo(x)\n yield\nend" does to_s of "Foo(\"bar baz\": Int32)" does to_s of "Foo(\"bar baz\": Int32)" does to_s of "{{ foo }}" does to_s of "{{ foo }}" does to_s of "%r(/)" does to_s of "%r(/)" does to_s of "if (1 + 2\n3)\n 4\nend" does to_s of "if (1 + 2\n3)\n 4\nend" does to_s of "1.responds_to?(:\"&&\")" does to_s of "1.responds_to?(:\"&&\")" does to_s of "offsetof(Foo, @bar)" does to_s of "offsetof(Foo, @bar)" does to_s of "class Foo\n private def bar\n end\nend" does to_s of "class Foo\n private def bar\n end\nend" does to_s of "def foo(*args)\nend" does to_s of "def foo(*args)\nend" does to_s of "def foo(x, @[Foo] **args)\nend" does to_s of "def foo(x, @[Foo] **args)\nend" does to_s of "1[2, x: 3, &.foo]" does to_s of "1[2, x: 3, &.foo]" does to_s of "foo.%" does to_s of "foo.%" does to_s of "macro foo\n %bar = 1\nend" does to_s of "macro foo\n %bar = 1\nend" does to_s of "def foo(@[Foo] x y)\nend" does to_s of "def foo(@[Foo] x y)\nend" does to_s of "%r{\#{1}\\/\\0}" does to_s of "%r{\#{1}\\/\\0}" does to_s of "/\\//" does to_s of "/\\//" does to_s of "def foo(& : (->))\nend" does to_s of "def foo(& : (->))\nend" does to_s of "`\#{1}\\n\\0`" does to_s of "`\#{1}\\n\\0`" does to_s of "alias Foo = Void" does to_s of "alias Foo = Void" does to_s of "foo[x, y, a: 1, b: 2] = z" does to_s of "foo[x, y, a: 1, b: 2] = z" does to_s of "lib Foo::Bar\nend" does to_s of "lib Foo::Bar\nend" does to_s of "begin\n (1)\nend" does to_s of "begin\n (1)\nend" does to_s of "%(\"\#{foo}\")" does to_s of "%(\"\#{foo}\")" does to_s of "foo { |i| i.bar { i } }" does to_s of "foo { |i| i.bar { i } }" does to_s of "def foo\n yield\nend" does to_s of "def foo\n yield\nend" does to_s of "1[2, x: 3, &.foo] = 4" does to_s of "1[2, x: 3, &.foo] = 4" does to_s of "def foo(@[Foo] *args)\nend" does to_s of "def foo(@[Foo] *args)\nend" does to_s of "あ.い, う.え.お = 1, 2" does to_s of "あ.い, う.え.お = 1, 2" does to_s of "lib LibC\n fun getch = \"get.char\"\nend" does to_s of "lib LibC\n fun getch = \"get.char\"\nend" does to_s of "{foo: (1 + 2)}" does to_s of "{foo: (1 + 2)}" does to_s of "1.[]=" does to_s of "1.[]=" does to_s of "asm(\"nop\" :: \"c\"(3), \"d\"(4) ::)" does to_s of "asm(\"nop\" :: \"c\"(3), \"d\"(4) ::)" does to_s of "foo.nil?" does to_s of "foo.nil?" does to_s of "1.&**" does to_s of "1.&**" does to_s of "enum A : B\nend" does to_s of "enum A : B\nend" does to_s of "lib Foo\n union Foo\n a : Int\n b : Int32\n end\nend" does to_s of "lib Foo\n union Foo\n a : Int\n b : Int32\n end\nend" does to_s of "def foo(**args)\nend" does to_s of "def foo(**args)\nend" does to_s of "macro foo(x, @[Foo] **args)\nend" does to_s of "macro foo(x, @[Foo] **args)\nend" does to_s of "foo do\n begin\n bar\n end\nend" does to_s of "foo do\n begin\n bar\n end\nend" does to_s of "({} of K => V).foo" does to_s of "({} of K => V).foo" does to_s of "1.&*" does to_s of "1.&*" does to_s of "foo(1, (2 + 3), bar: (4 + 5))" does to_s of "foo(1, (2 + 3), bar: (4 + 5))" does to_s of "macro foo(x, *y)\nend" does to_s of "macro foo(x, *y)\nend" does to_s of "foo { |(x, y)| x }" does to_s of "foo { |(x, y)| x }" does to_s of "{\"foo bar\": 1}" does to_s of "{\"foo bar\": 1}" does to_s of "1_f32" does to_s of "1_f32" does to_s of "foo(&.==(2))" does to_s of "foo(&.==(2))" does to_s of "1.as(Int32)" does to_s of "1.as(Int32)" does to_s of "asm(\"nop\" :::: \"volatile\")" does to_s of "asm(\"nop\" :::: \"volatile\")" does to_s of "begin\n (1)\n 2\nend" does to_s of "begin\n (1)\n 2\nend" does to_s of "macro foo\n\\{{ @type }}\nend" does to_s of "macro foo\n\\{{ @type }}\nend" does to_s of "(1..)" does to_s of "(1..)" does to_s of "yield(1)" does to_s of "yield(1)" does to_s of "if true\n (1)\n 2\nend" does to_s of "if true\n (1)\n 2\nend" does to_s of "->::foo(Int32, String)" does to_s of "->::foo(Int32, String)" does to_s of ":\"{\"" does to_s of ":\"{\"" does to_s of "1[&.foo] = 2" does to_s of "1[&.foo] = 2" does to_s of "def foo(@[Foo] x : T = 1)\nend" does to_s of "def foo(@[Foo] x : T = 1)\nend" does to_s of "macro foo(@[Foo] id)\nend" does to_s of "macro foo(@[Foo] id)\nend" does to_s of "def foo(\"bar baz\" qux)\nend" does to_s of "def foo(\"bar baz\" qux)\nend" does to_s of "1_f64" does to_s of "1_f64" does to_s of "1 <= 2 <= 3" does to_s of "1 <= 2 <= 3" does to_s of "def foo(**x)\n yield\nend" does to_s of "def foo(**x)\n yield\nend" does to_s of "lib Foo\n A = Pointer(Void).new(0)\n struct B\n x : Void*\n y : Int[1]\n end\n fun c(Void*) : Char[2]*\nend" does to_s of "lib Foo\n A = Pointer(Void).new(0)\n struct B\n x : Void*\n y : Int[1]\n end\n fun c(Void*) : Char[2]*\nend" does to_s of "1.//(2, &block)" does to_s of "1.//(2, &block)" does to_s of "begin\n (@x = x).is_a?(Foo)\nend" does to_s of "begin\n (@x = x).is_a?(Foo)\nend" does to_s of "begin\n ()\nend" does to_s of "begin\n ()\nend" does to_s of "type(Foo = Void)" does to_s of "type(Foo = Void)" does to_s of "1 <= (2 <= 3)" does to_s of "1 <= (2 <= 3)" does to_s of "def foo(x : Foo((T -> U)))\nend" does to_s of "def foo(x : Foo((T -> U)))\nend" does to_s of "{(1 + 2)}" does to_s of "{(1 + 2)}" does to_s of "%r( )" does to_s of "%r( )" does to_s of "{% verbatim do %}\n 1{{ 2 }}\n 3{{ 4 }}\n{% end %}" does to_s of "{% verbatim do %}\n 1{{ 2 }}\n 3{{ 4 }}\n{% end %}" does to_s of "{% for foo in bar %}\n {{ foo }}\n{% end %}" does to_s of "{% for foo in bar %}\n {{ foo }}\n{% end %}" does to_s of "->(x : Int32, y : Bool) : Char do\n 'a'\nend" does to_s of "->(x : Int32, y : Bool) : Char do\n 'a'\nend" does to_s of "他.说 = \"你好\"" does to_s of "他.说 = \"你好\"" does to_s of "def foo(**args : T)\nend" does to_s of "def foo(**args : T)\nend" does to_s of "macro foo(*var)\nend" does to_s of "macro foo(*var)\nend" does to_s of "(1 + 2)..3" does to_s of "(1 + 2)..3" does to_s of "def foo(x)\n yield\nend" does to_s of "def foo(x)\n yield\nend" does to_s of "def foo(x : T = 1)\nend" does to_s of "def foo(x : T = 1)\nend" does to_s of "/\\s/" does to_s of "/\\s/" does to_s of "a.as?(Int32)" does to_s of "a.as?(Int32)" does to_s of "select\nwhen foo\n select\n when bar\n 1\n else\n 2\n end\nelse\n select\n when baz\n 3\n else\n 4\n end\nend" does to_s of "select\nwhen foo\n select\n when bar\n 1\n else\n 2\n end\nelse\n select\n when baz\n 3\n else\n 4\n end\nend" does to_s of "/\\(group\\)/" does to_s of "/\\(group\\)/" does to_s of "{% if foo %}\n foo_then\n{% else %}\n foo_else\n{% end %}" does to_s of "{% if foo %}\n foo_then\n{% else %}\n foo_else\n{% end %}" does to_s of "1e10_f64" does to_s of "1e10_f64" does to_s of "def foo(& : ->)\nend" does to_s of "def foo(& : ->)\nend" does to_s of "foo(a.as(Int32))" does to_s of "foo(a.as(Int32))" does to_s of "1[&.foo]" does to_s of "1[&.foo]" does to_s of "asm(\"nop\" : \"a\"(1), \"b\"(2) : \"c\"(3), \"d\"(4) : \"e\", \"f\" : \"volatile\", \"alignstack\", \"intel\")" does to_s of "asm(\"nop\" : \"a\"(1), \"b\"(2) : \"c\"(3), \"d\"(4) : \"e\", \"f\" : \"volatile\", \"alignstack\", \"intel\")" does to_s of "case 1; when .foo?; 2; end" does to_s of "case 1; when .foo?; 2; end" does to_s of "-> : Int32 do\nend" does to_s of "-> : Int32 do\nend" does to_s of "lib LibC\n fun getchar(Int, Float)\nend" does to_s of "lib LibC\n fun getchar(Int, Float)\nend" does to_s of "foo x: 1, y: 2, &.bar" does to_s of "foo x: 1, y: 2, &.bar" does to_s of "def foo(x, **args, &block : _ -> _)\nend" does to_s of "def foo(x, **args, &block : _ -> _)\nend" does to_s of "def foo(*args : _)\nend" does to_s of "def foo(*args : _)\nend" does to_s of "class Foo\n # doc\n def foo\n end\nend" does to_s of "class Foo\n # doc\n def foo\n end\nend" does to_s of "asm(\"nop\" ::::)" does to_s of "asm(\"nop\" ::::)" does to_s of "他.说(\"你好\")" does to_s of "他.说(\"你好\")" does to_s of "def foo(x : (T -> U).class)\nend" does to_s of "def foo(x : (T -> U).class)\nend" does to_s of "%x(whoami)" does to_s of "%x(whoami)" does to_s of "foo &.bar" does to_s of "foo &.bar" does to_s of "asm(\"bl trap\" :::: \"unwind\")" does to_s of "asm(\"bl trap\" :::: \"unwind\")" does to_s of "lib Foo\n FOO = 0\nend" does to_s of "lib Foo\n FOO = 0\nend" does to_s of "macro foo(x, **args)\nend" does to_s of "macro foo(x, **args)\nend" does to_s of "macro foo(@[Foo] **args)\nend" does to_s of "macro foo(@[Foo] **args)\nend" does to_s of "1.//(2, a: 3)" does to_s of "1.//(2, a: 3)" does to_s of "->::Foo::Bar.foo" does to_s of "->::Foo::Bar.foo" does to_s of "def foo(x, **args)\nend" does to_s of "def foo(x, **args)\nend" does to_s of "/\#{1 / 2}/" does to_s of "/\#{1 / 2}/" does to_s of "macro foo(@[Foo] x, @[Foo] *y)\nend" does to_s of "macro foo(@[Foo] x, @[Foo] *y)\nend" does to_s of "def foo(x, **args, &block : (_ -> _))\nend" does to_s of "def foo(x, **args, &block : (_ -> _))\nend" does to_s of "%r()imx" does to_s of "%r()imx" does to_s of "def foo(**options, &block)\nend" does to_s of "def foo(**options, &block)\nend" does to_s of "begin\n (1)\n 2\nrescue\nend" does to_s of "begin\n (1)\n 2\nrescue\nend" does to_s of "alias Foo::Bar = Void" does to_s of "alias Foo::Bar = Void" does to_s of "macro foo\n %bar = 1; end" does to_s of "macro foo\n %bar = 1; end" does to_s of "macro foo\n\\{%@type %}\nend" does to_s of "macro foo\n\\{%@type %}\nend" does to_s of "macro foo\n{% verbatim do %}1{% end %}\nend" does to_s of "macro foo\n{% verbatim do %}1{% end %}\nend" does to_s of ":foo" does to_s of ":foo" does to_s of "/hello world/imx" does to_s of "/hello world/imx" does to_s of "def foo(@[Foo] x, @[Bar] **args, @[Baz] &block)\nend" does to_s of "def foo(@[Foo] x, @[Bar] **args, @[Baz] &block)\nend" does to_s of "fun foo(a : Void, b : Void, ...) : Void\nend" does to_s of "fun foo(a : Void, b : Void, ...) : Void\nend" does to_s of "lib Foo\nend" does to_s of "lib Foo\nend" does to_s of "foo()" does to_s of "foo()" does to_s of "foo(x : (T -> U) | V)" does to_s of "foo(x : (T -> U) | V)" does to_s of "/ /" does to_s of "/ /" does to_s of "foo.*" does to_s of "foo.*" does to_s of "def foo(x y)\nend" does to_s of "def foo(x y)\nend" does to_s of "def foo(@[Foo] **args)\nend" does to_s of "def foo(@[Foo] **args)\nend" does to_s of "&+1" does to_s of "&+1" does to_s of "macro foo\n{% @type %}\nend" does to_s of "macro foo\n{% @type %}\nend" does to_s of "macro foo(@[Foo] &block)\nend" does to_s of "macro foo(@[Foo] &block)\nend" does to_s of "foo(x : (T -> U).class)" does to_s of "foo(x : (T -> U).class)" does to_s of "1.~(2) do\nend" does to_s of "1.~(2) do\nend" does to_s of "1.0" does to_s of "1.0" does to_s of "foo[x, y, a: 1, b: 2]" does to_s of "foo[x, y, a: 1, b: 2]" does to_s of "return begin\n 1\n 2\nend" does to_s of "return begin\n 1\n 2\nend" does to_s of "if 1\n begin\n 2\n end\nelse\n begin\n 3\n end\nend" does to_s of "if 1\n begin\n 2\n end\nelse\n begin\n 3\n end\nend" does to_s of "def foo(x : X, y : Y) forall X, Y\nend" does to_s of "def foo(x : X, y : Y) forall X, Y\nend" does to_s of "asm(\"nop\" ::: \"e\" : \"volatile\")" does to_s of "asm(\"nop\" ::: \"e\" : \"volatile\")" does to_s of "lib LibFoo\n fun foo(x : Foo((T -> U)))\nend" does to_s of "lib LibFoo\n fun foo(x : Foo((T -> U)))\nend" does to_s of "_foo.bar" does to_s of "_foo.bar" does to_s of "def foo(x : (T -> U) -> V, *args : (T -> U) -> V, y : (T -> U) -> V, **opts : (T -> U) -> V, & : (T -> U) -> V) : ((T -> U) -> V)\nend" does to_s of "def foo(x : (T -> U) -> V, *args : (T -> U) -> V, y : (T -> U) -> V, **opts : (T -> U) -> V, & : (T -> U) -> V) : ((T -> U) -> V)\nend" does to_s of "&-1" does to_s of "&-1" does to_s of "!a" does to_s of "!a" does to_s of "1.[](2) do\nend" does to_s of "1.[](2) do\nend" does to_s of "macro foo\n 123\nend" does to_s of "macro foo\n 123\nend" does to_s of "1 & 2 & (3 | 4)" does to_s of "1 & 2 & (3 | 4)" does to_s of "\"\#{1}\\0\"" does to_s of "\"\#{1}\\0\"" does to_s of "/hello world/" does to_s of "/hello world/" does to_s of "def foo(x : (T -> U) | V)\nend" does to_s of "def foo(x : (T -> U) | V)\nend" does to_s of "Foo()" does to_s of "Foo()" does to_s of "(1 || 1.1).as(Int32)" does to_s of "(1 || 1.1).as(Int32)" does to_s of "macro foo(*, var)\nend" does to_s of "macro foo(*, var)\nend" does to_s of "\"\#{(1 + 2)}\"" does to_s of "\"\#{(1 + 2)}\"" does to_s of "macro foo(x, @[Foo] *y)\nend" does to_s of "macro foo(x, @[Foo] *y)\nend" does to_s of "foo : (A | B).class" does to_s of "foo : (A | B).class" does to_s of "%r{\\/\\0}" does to_s of "%r{\\/\\0}" does to_s of "begin\n (1)\nrescue\nend" does to_s of "begin\n (1)\nrescue\nend" does to_s of "macro foo\n{{ @type }}\nend" does to_s of "macro foo\n{{ @type }}\nend" does to_s of "foo[x : (T -> U) -> V, W]" does to_s of "foo[x : (T -> U) -> V, W]" does to_s of "# doc\ndef foo\nend" does to_s of "# doc\ndef foo\nend" does to_s of "asm(\"nop\" :: \"a\"(1) :: \"volatile\")" does to_s of "asm(\"nop\" :: \"a\"(1) :: \"volatile\")" does to_s of x = (1 2 ) does to_s of x = (1 2 ) does to_s of "def foo(x, **args, &block)\nend" does to_s of "def foo(x, **args, &block)\nend" does to_s of "{% if foo %}\n foo_then\n{% end %}" does to_s of "{% if foo %}\n foo_then\n{% end %}" does to_s of "`\\n\\0`" does to_s of "`\\n\\0`" does to_s of "(1 & 2) & (3 | 4)" does to_s of "(1 & 2) & (3 | 4)" Crystal::Repl::Interpreter special vars does special var that's a reference does special var that's a reference 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 when there are optional arguments does special var that's a reference when there are optional arguments does special var that's a reference for multidispatch does special var that's a reference for multidispatch 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) Crystal::Repl::Interpreter pointers discards pointer malloc discards pointer malloc interprets pointer diff interprets pointer diff interprets pointer set and get (clear stack) interprets pointer set and get (clear stack) discards pointer realloc discards pointer realloc discards pointerof discards pointerof interprets pointerof and mutates memory (there are more variables) interprets pointerof and mutates memory (there are more variables) interprets pointer set and get (union type, setter value) interprets pointer set and get (union type, setter value) pointerof read `StaticArray#@buffer` (1) pointerof read `StaticArray#@buffer` (1) pointerof instance var pointerof instance var interprets pointer set and get (int) interprets pointer set and get (int) discards pointer diff discards pointer diff interprets pointer diff, negative interprets pointer diff, negative interprets pointer new and pointer address interprets pointer new and pointer address discards pointer get discards pointer get interprets pointer set and get (union type) interprets pointer set and get (union type) interprets pointer set and get (bool) interprets pointer set and get (bool) interprets pointer add interprets pointer add interprets pointerof, mutates var, read pointer interprets pointerof, mutates var, read pointer interprets nilable pointer truthiness interprets nilable pointer truthiness pointerof read `StaticArray#@buffer` (2) pointerof read `StaticArray#@buffer` (2) discards pointer add discards pointer add pointerof class var pointerof class var interprets pointer realloc wrapper interprets pointer realloc wrapper interprets pointerof, mutates pointer, read var interprets pointerof, mutates pointer, read var pointerof read instance var pointerof read instance var interprets pointer realloc interprets pointer realloc discards pointer set discards pointer set discards pointer new discards pointer new Crystal::Doc::Method args_to_s shows simple args shows simple args shows double splat args shows double splat args shows underscore restriction shows underscore restriction shows args and return type restriction shows args and return type restriction shows default value of arg with highlighting shows default value of arg with highlighting shows block args with underscore shows block args with underscore shows return type restriction shows return type restriction shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows typeof restriction of arg with highlighting shows typeof restriction of arg with highlighting shows block args if a def has `yield` shows block args if a def has `yield` shows external name of arg shows external name of arg shows block args shows block args shows splat args shows splat args doc inherits doc from ancestor (no extra comment) inherits doc from ancestor (no extra comment) trailing comment is not a doc comment trailing comment is not a doc comment inherits doc from previous def (no extra comment) inherits doc from previous def (no extra comment) inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit: plus more content) inherits doc from ancestor (use :inherit: plus more content) gets doc from underlying method gets doc from underlying method trailing comment is not part of a doc comment trailing comment is not part of a doc comment Normalize: case normalizes case without when and else normalizes case without when and else normalizes case with nil to is_a? normalizes case with nil to is_a? normalizes case without value with many expressions in when normalizes case without value with many expressions in when normalizes case with implicit responds_to? (#3040) normalizes case with implicit responds_to? (#3040) normalizes case with implicit as (#3040) normalizes case with implicit as (#3040) normalizes case with Path.class to is_a? (in) normalizes case with Path.class to is_a? (in) normalizes case with implicit is_a? (#3040) normalizes case with implicit is_a? (#3040) normalizes case with generic to is_a? normalizes case with generic to is_a? normalizes case with implicit as? (#3040) normalizes case with implicit as? (#3040) normalizes case with Path.class to is_a? normalizes case with Path.class to is_a? normalizes case with assignment wrapped by paren normalizes case with assignment wrapped by paren normalizes case with multiple expressions and implicit obj normalizes case with multiple expressions and implicit obj normalizes case with many expressions in when normalizes case with many expressions in when normalizes case without when but else normalizes case without when but else normalizes case without cond, when but else normalizes case without cond, when but else normalizes case with multiple expressions with all underscores normalizes case with multiple expressions with all underscores normalizes case with multiple expressions and non-tuple normalizes case with multiple expressions and non-tuple normalizes case with Path to is_a? normalizes case with Path to is_a? normalizes case without cond, when and else normalizes case without cond, when and else normalizes case with multiple expressions and comma normalizes case with multiple expressions and comma normalizes case with call normalizes case with call normalizes case with assignment normalizes case with assignment normalizes case without value normalizes case without value normalizes case with multiple expressions and types normalizes case with multiple expressions and types normalizes case with implicit call normalizes case with implicit call normalizes case with multiple expressions with all underscores twice normalizes case with multiple expressions with all underscores twice normalizes case with multiple expressions normalizes case with multiple expressions normalizes case with var in cond normalizes case with var in cond normalizes case with Generic.class to is_a? normalizes case with Generic.class to is_a? normalizes case with implicit ! normalizes case with implicit ! normalizes case with multiple expressions with underscore normalizes case with multiple expressions with underscore Normalize: string interpolation normalizes string interpolation with multiple lines normalizes string interpolation with multiple lines replaces string constant replaces string constant replaces through multiple levels replaces through multiple levels normalizes heredoc normalizes heredoc replaces string constant that results from macro expansion replaces string constant that results from macro expansion normalizes string interpolation normalizes string interpolation Code gen: c enum codegens enum with (1 + 2) * 3 codegens enum with (1 + 2) * 3 codegens enum with +1 codegens enum with +1 codegens enum that refers to another constant codegens enum that refers to another constant codegens enum that refers to another enum constant codegens enum that refers to another enum constant codegens enum with ~1 codegens enum with ~1 codegens enum with 1 << 3 codegens enum with 1 << 3 codegens enum with 3 - 2 codegens enum with 3 - 2 codegens enum with 3 &- 2 codegens enum with 3 &- 2 codegens enum with 3 &* 2 codegens enum with 3 &* 2 codegens enum with 10 & 3 codegens enum with 10 & 3 codegens enum with 10 % 3 codegens enum with 10 % 3 codegens enum value 3 codegens enum value 3 codegens enum with 10 | 3 codegens enum with 10 | 3 codegens enum with 1 &+ 2 codegens enum with 1 &+ 2 codegens enum value 4 codegens enum value 4 codegens enum with 1 + 2 codegens enum with 1 + 2 codegens enum value codegens enum value codegens enum with 10 // 2 codegens enum with 10 // 2 codegens enum with 10 ^ 3 codegens enum with 10 ^ 3 codegens enum with 3 * 2 codegens enum with 3 * 2 codegens enum with -1 codegens enum with -1 codegens enum with 100 >> 3 codegens enum with 100 >> 3 codegens enum value 2 codegens enum value 2 Semantic: ReferenceStorage 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 value type errors if T is a value type errors if T is a struct type errors if T is a struct type errors if T is a nilable type errors if T is a nilable type Code gen: struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct can cast virtual struct to specific struct codegens virtual structs union (2) codegens virtual structs union (2) uses nilable struct uses nilable struct returns self returns self assigning a struct makes a copy (1) assigning a struct makes a copy (1) codegens virtual struct with pointer codegens virtual struct with pointer passes a generic struct as a parameter makes a copy passes a generic struct as a parameter makes a copy can call new on abstract struct with single child (#7309) can call new on abstract struct with single child (#7309) creates structs creates structs mutates a virtual struct mutates a virtual struct creates structs with instance var creates structs with instance var uses struct in if uses struct in if uses struct in if uses struct in if uses struct in if uses struct in if uses struct in if uses struct in if uses struct in if uses struct in if allows assigning to struct argument (bug) allows assigning to struct argument (bug) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) codegens virtual struct metaclass (#2551) (4) assigning a struct makes a copy (2) assigning a struct makes a copy (2) casts virtual struct to base type, only one subclass (#2885) casts virtual struct to base type, only one subclass (#2885) returns struct as a copy returns struct as a copy does phi of struct does phi of struct creates struct in def creates struct in def codegens struct assigned to underscore (#1842) codegens struct assigned to underscore (#1842) codegens virtual structs union (1) codegens virtual structs union (1) codegens virtual struct codegens virtual struct codegens virtual struct metaclass (#2551) (2) codegens virtual struct metaclass (#2551) (2) returns self with block returns self with block declares const struct declares const struct declares const struct declares const struct declares const struct declares const struct declares const struct declares const struct declares const struct declares const struct codegens virtual struct metaclass (#2551) (1) codegens virtual struct metaclass (#2551) (1) passes a struct as a parameter makes a copy passes a struct as a parameter makes a copy codegens virtual struct metaclass (#2551) (3) codegens virtual struct metaclass (#2551) (3) Code gen: offsetof returns offset allowing manual access of first struct field returns offset allowing manual access of first struct field returns offset of extern union returns offset of extern union returns offset allowing manual access of tuple items returns offset allowing manual access of tuple items 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 class field that isn't first returns offset allowing manual access of class field that isn't first returns offset of `StaticArray#@buffer` returns offset of `StaticArray#@buffer` Semantic: annotation errors when annotate instance variable in subclass errors when annotate instance variable in subclass errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (1) (#8614) #annotation uses annotation value, positional uses annotation value, positional uses annotation value, keyword uses annotation value, keyword doesn't carry link annotation from lib to fun doesn't carry link annotation from lib to fun finds annotation in generic parent (#7885) finds annotation in generic parent (#7885) finds annotation on an restricted method block arg finds annotation on an restricted method block arg adds annotation on def adds annotation on def can't find annotation in module can't find annotation in module finds annotation in lib finds annotation in lib errors if annotation doesn't point to an annotation type errors if annotation doesn't point to an annotation type finds annotation on method arg finds annotation on method arg can't find annotation on def, when other annotations are present can't find annotation on def, when other annotations are present errors if using invalid annotation on fun errors if using invalid annotation on fun finds annotation in instance var (declaration, generic) finds annotation in instance var (declaration, generic) can't find annotation in instance var, when other annotations are present can't find annotation in instance var, when other annotations are present errors if annotation doesn't exist errors if annotation doesn't exist can't find annotation on def can't find annotation on def finds annotation in struct finds annotation in struct finds annotation in instance var (assignment) finds annotation in instance var (assignment) errors if using annotation other than ThreadLocal for class vars errors if using annotation other than ThreadLocal for class vars finds annotation on method double splat arg finds annotation on method double splat arg 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 finds annotation in class finds annotation in class finds annotation in instance var (declaration) finds annotation in instance var (declaration) can't find annotation in instance var can't find annotation in instance var overrides annotation value in type overrides annotation value in type finds annotation on method splat arg finds annotation on method splat arg finds annotation in module finds annotation in module finds annotation in enum finds annotation in enum arguments returns a correctly with named and positional args returns a correctly with named and positional args #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 #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 doesn't bleed annotation from class into class variable (#8314) doesn't bleed annotation from class into class variable (#8314) declares annotation declares annotation errors if wanting to add type inside annotation (2) (#8614) errors if wanting to add type inside annotation (2) (#8614) #annotations 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 lib finds annotations in lib uses annotations value, positional uses annotations value, positional adds annotations on def adds annotations on def 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 finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) finds annotations in enum finds annotations in enum uses annotations value, keyword uses annotations value, keyword collects annotations values in type collects annotations values in type overrides annotations value in type overrides annotations value in type can't find annotations on def, when other annotations are present can't find annotations on def, when other annotations are present finds annotations on a module finds annotations on a module finds annotations in struct finds annotations in struct finds annotations in instance var (declaration) finds annotations in instance var (declaration) finds annotations in class finds annotations in class 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 finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) all types returns an empty array if there are none defined returns an empty array if there are none defined finds annotations on a lib finds annotations on a lib finds annotations on a class finds annotations on a class adds annotations on def adds annotations on def finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) finds annotations on a enum finds annotations on a enum find annotations on method parameters find annotations on method parameters finds annotations on a struct finds annotations on a struct finds annotations on a module finds annotations on a module finds annotations in instance var (declaration) finds annotations in instance var (declaration) finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) Normalize: regex literal options im im empty empty imx imx x x i i StringInterpolation simple simple StringLiteral simple simple expands to const expands to const Crystal::Repl can parse and evaluate snippets can parse and evaluate snippets can return static and runtime type information for Non Union Non Union VirtualType VirtualType MixedUnionType MixedUnionType UnionType UnionType Semantic: virtual metaclass types virtual metaclass types virtual metaclass allows allocating virtual type when base class is abstract allows allocating virtual type when base class is abstract merges metaclass types merges metaclass types yields virtual type in block arg if class is abstract yields virtual type in block arg if class is abstract types virtual metaclass method types virtual metaclass method restricts virtual metaclass to Class (#11376) restricts virtual metaclass to Class (#11376) allows passing metaclass to virtual metaclass restriction allows passing metaclass to virtual metaclass restriction types metaclass node types metaclass node allows passing metaclass to virtual metaclass restriction allows passing metaclass to virtual metaclass restriction merges metaclass types with 3 types merges metaclass types with 3 types Code gen: tuple codegens tuple metaclass [2]? codegens tuple metaclass [2]? 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) gets size at compile time gets size at compile time allows malloc pointer of tuple allows malloc pointer of tuple codegens tuple [0..1] codegens tuple [0..1] codegens tuple [1]? codegens tuple [1]? codegens splats inside tuples codegens splats inside tuples 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 metaclass [1..0] codegens tuple metaclass [1..0] codegens tuple class codegens tuple class codegens tuple [0..2]? codegens tuple [0..2]? codegens tuple [-3..2]? codegens tuple [-3..2]? codegens tuple metaclass [3..2]? codegens tuple metaclass [3..2]? codegens tuple [0..1]? codegens tuple [0..1]? upcasts tuple union to compatible tuple upcasts tuple union to compatible tuple accesses T and creates instance from it accesses T and creates instance from it provides T as a tuple literal provides T as a tuple literal codegens tuple [2..2] codegens tuple [2..2] codegens tuple metaclass [0] codegens tuple metaclass [0] codegens tuple [2..2]? codegens tuple [2..2]? assigns tuple to compatible tuple assigns tuple to compatible tuple codegens tuple [1] codegens tuple [1] passed tuple to def passed tuple to def codegens tuple metaclass [0..1] codegens tuple metaclass [0..1] assigns two same-size tuple types to a same var (#3132) assigns two same-size tuple types to a same var (#3132) downcasts union to mixed tuple type downcasts union to mixed tuple type assigns tuple union to compatible tuple assigns tuple union to compatible tuple codegens tuple [0..0] codegens tuple [0..0] upcasts tuple inside compatible tuple upcasts tuple inside compatible tuple codegens tuple [0..2] codegens tuple [0..2] codegens tuple [1..1]? codegens tuple [1..1]? merges two tuple types of same size (1) merges two tuple types of same size (1) codegens tuple [3..2]? codegens tuple [3..2]? codegens tuple metaclass [1] codegens tuple metaclass [1] codegens tuple [0] codegens tuple [0] codegens tuple [0..0]? codegens tuple [0..0]? codegens tuple metaclass [0..0] codegens tuple metaclass [0..0] 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) merges two tuple types of same size (2) merges two tuple types of same size (2) codegens tuple [1..1] codegens tuple [1..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 downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) assigns tuple inside union to union with compatible tuple assigns tuple inside union to union with compatible tuple codegens tuple [2]? codegens tuple [2]? codegens tuple [0]? codegens tuple [0]? codegens tuple [1..0] codegens tuple [1..0] upcasts tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple codegens tuple [1..0]? codegens tuple [1..0]? codegens tuple [1] (2) codegens tuple [1] (2) Crystal::Repl::Interpreter is_a? does is_a? from NilableProcType to Nil does is_a? from NilableProcType to Nil does is_a? from NilableType to NonGenericClassType (false) does is_a? from NilableType to NonGenericClassType (false) does is_a? from NilableProcType to non-Nil does is_a? from NilableProcType to non-Nil does is_a? from VirtualType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (true) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableType to NonGenericClassType (true) does is_a? from NilableType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (false) does is_a? from VirtualType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) Semantic: private doesn't find private def in another file doesn't find private def in another 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 module defined through macro (#8715) doesn't find private module defined through macro (#8715) 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 finds private def when invoking from inside macro (#2082) finds private def when invoking from inside macro (#2082) doesn't find private alias from outside namespace doesn't find private alias from outside namespace can use instance var initializer in private type can use instance var initializer in private type doesn't find private constant in another file (#7850) doesn't find private constant in another file (#7850) can use types in private type can use types in private type doesn't find private thing defined through recursive macro (#8715) doesn't find private thing defined through recursive macro (#8715) 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) doesn't find private class in another file doesn't find private class in another file find module private macro inside the module find module private macro inside the module doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) doesn't find private macro in another file doesn't find private macro in another file doesn't find private enum from outside namespace doesn't find private enum from outside namespace doesn't find private constant from outside namespace, long name (#8831) doesn't find private constant 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) finds private type from inside namespace in subclass finds private type from inside namespace in subclass gives private constant error in macro gives private constant error in macro can use class var initializer in private type can use class var initializer in private type finds private type in same file finds private type in same file doesn't find private alias from outside namespace, long name (#8831) doesn't find private alias 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) finds private class in macro expansion finds private class in macro expansion doesn't define private class with global type name doesn't define private class with global type name finds private def in same file that invokes another def finds private def in same file that invokes another def doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) 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) doesn't find private lib from outside namespace doesn't find private lib from outside namespace doesn't find private macro defined through macro (#8715) doesn't find private macro defined through macro (#8715) 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 module private macro outside the module doesn't find module private macro outside the module doesn't find private enum from outside namespace, long name (#8831) doesn't find private enum from outside namespace, long name (#8831) finds private type from inside namespace finds private type from inside 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 alias in another file doesn't find private alias in another file types private def correctly types private def correctly 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 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 doesn't find private module from outside namespace doesn't define private module with global type name doesn't define private module with global type name 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 doesn't find private class from outside namespace doesn't find private class from outside namespace doesn't find private class defined through macro (#8715) doesn't find private class defined through macro (#8715) finds private def in same file finds private def in same file doesn't define private enum with global type name doesn't define private enum with global type name finds private macro in same file finds private macro in same file Code gen: named tuple allows named tuple covariance allows named tuple covariance accesses T and creates instance from it accesses T and creates instance from it merges two named tuple types with same keys but different types (1) merges two named tuple types with same keys but different types (1) upcasts named tuple inside union to union with compatible named tuple upcasts named tuple inside union to union with compatible named tuple assigns named tuple inside union to union with compatible named tuple assigns named tuple inside union to union with compatible named tuple merges two named tuple types with same keys but different types (2) merges two named tuple types with same keys but different types (2) provides T as a named tuple literal provides T as a named tuple literal assigns named tuple union to compatible named tuple assigns named tuple union to compatible named tuple upcasts named tuple inside compatible named tuple upcasts named tuple inside compatible named tuple codegens union of tuple of float with tuple of tuple of float codegens union of tuple of float with tuple of tuple of float does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class does to_s for NamedTuple class codegens tuple nilable index (1) codegens tuple nilable index (1) doesn't error if NamedTuple includes a non-generic module (#10380) doesn't error if NamedTuple includes a non-generic module (#10380) codegens tuple index another order codegens tuple index another order codegens tuple index codegens tuple index assigns two same-size named tuple types to a same var (#3132) assigns two same-size named tuple types to a same var (#3132) codegens tuple nilable index (2) codegens tuple nilable index (2) passes named tuple to def passes named tuple to def assigns named tuple to compatible named tuple assigns named tuple to compatible named tuple upcasts named tuple union to compatible named tuple upcasts named tuple union to compatible named tuple downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) codegens tuple nilable index (3) codegens tuple nilable index (3) gets keys at compile time (2) gets keys at compile time (2) doesn't crash when overload doesn't match doesn't crash when overload doesn't match gets keys at compile time (1) gets keys at compile time (1) gets size at compile time gets size at compile time Code gen: def with default value 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 resolves expanded call to current type, not to virtual type resolves expanded call to current type, not to virtual type 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 considers first the one with more arguments considers first the one with more arguments Semantic: automatic cast says ambiguous call on union (#8655) says ambiguous call on union (#8655) casts integer expression to larger type (#9565) casts integer expression to larger type (#9565) casts symbol literal to enum casts symbol literal to enum casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration autocasts float32 variable to float64 type (#9565) autocasts float32 variable to float64 type (#9565) doesn't autocast number on union (#8655) doesn't autocast number on union (#8655) can autocast to alias in default value can autocast to alias in default value casts literal integer through alias with union casts literal integer through alias with union can autocast to union in default value (symbol and int) can autocast to union in default value (symbol and int) casts literal integer in private top-level method (#7016) casts literal integer in private top-level method (#7016) casts literal integer (Int64 -> Int32, too big) casts literal integer (Int64 -> Int32, too big) casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) can autocast to union in default value (multiple enums) can autocast to union in default value (multiple enums) can't cast integer to another type when it doesn't fit (#9565) can't cast integer to another type when it doesn't fit (#9565) errors when autocast default value doesn't match enum member errors when autocast default value doesn't match enum member casts Symbol to Enum in cvar type declaration casts Symbol to Enum in cvar type declaration casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) autocasts nested type from non-nested type (#10315) autocasts nested type from non-nested type (#10315) casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration says ambiguous call for integer var to union type (#9565) says ambiguous call for integer var to union type (#9565) says ambiguous call for integer says ambiguous call for integer casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment doesn't do multidispatch if an overload matches exactly (#8217) doesn't do multidispatch if an overload matches exactly (#8217) casts integer variable to larger type (#9565) casts integer variable to larger type (#9565) autocasts integer variable to float type (#9565) autocasts integer variable to float type (#9565) says ambiguous call for integer on alias (#6620) says ambiguous call for integer on alias (#6620) casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic doesn't cast integer variable to larger type (not #9565) doesn't cast integer variable to larger type (not #9565) matches correct overload matches correct overload can autocast to union in default value can autocast to union in default value casts Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction autocasts first argument and second matches without autocast autocasts first argument and second matches without autocast errors if symbol name doesn't match enum member errors if symbol name doesn't match enum member can use automatic cast with `with ... yield` (#7736) can use automatic cast with `with ... yield` (#7736) doesn't say 'ambiguous call' when there's an exact match for symbol (#6601) doesn't say 'ambiguous call' when there's an exact match for symbol (#6601) doesn't do multidispatch if an overload matches exactly (#8217) doesn't do multidispatch if an overload matches exactly (#8217) casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) says ambiguous call for symbol says ambiguous call for symbol casts literal integer (Int32 -> no restriction) casts literal integer (Int32 -> no restriction) can match multiple times with the same argument type (#7578) can match multiple times with the same argument type (#7578) casts literal integer through alias with union casts literal integer through alias with union casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) says ambiguous call for integer var to larger type (#9565) says ambiguous call for integer var to larger type (#9565) says ambiguous call for integer (2) says ambiguous call for integer (2) casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) casts integer variable to larger type (Int64 to Int128) (#9565) casts integer variable to larger type (Int64 to Int128) (#9565) doesn't say 'ambiguous call' when there's an exact match for integer (#6601) doesn't say 'ambiguous call' when there's an exact match for integer (#6601) codegen: previous_def codegens previous def codegens 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 Crystal::Repl::Interpreter autocast autocasts integer var to integer (#12560) autocasts integer var to integer (#12560) autocasts integer var to float (#12560) autocasts integer var to float (#12560) autocasts symbol to enum in ivar initializer (#12216) autocasts symbol to enum in ivar initializer (#12216) autocasts float32 var to float64 (#12560) autocasts float32 var to float64 (#12560) autocasts int in multidispatch autocasts int in multidispatch autocasts symbol to enum in multidispatch (#11782) autocasts symbol to enum in multidispatch (#11782) autocasts number literal to float autocasts number literal to float autocasts symbol to enum autocasts symbol to enum autocasts number literal to integer autocasts number literal to integer Crystal::FFI::CallInterface .variadic zero varargs zero varargs basic basic validates args size validates args size .new with args with args sum struct sum struct simple call simple call make struct make struct array array all primitive arg types all primitive arg types Semantic: const 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 (1 &+ ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 &+ ZED) finds const from restriction finds const from restriction errors if constant has NoReturn type (#6139) errors if constant has NoReturn type (#6139) types a nested type with same name types a nested type with same name finds current type first finds current type first errors if using const in type declaration errors if using const in type declaration doesn't share variables with global scope doesn't share variables with global scope 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 constant types a constant 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) 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") 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 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 ('a') doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') finds constant in class that extends class (#205) finds constant in class that extends class (#205) errors if using const in restriction errors if using const in restriction keeps type of container when using Path keeps type of container when using Path errors if using constant as generic type (#3240) errors if using constant as generic type (#3240) errors if using const in uninitialized errors if using const in uninitialized 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) finds current type only for first path item (2) finds current type only for first path item (2) 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 return inside constant value (#5391) errors if using return inside constant value (#5391) types a global constant reference in static method types a global constant reference in static method errors on dynamic constant assignment inside block errors on dynamic constant assignment inside block doesn't crash with const used in initialize (bug) doesn't crash with const used in initialize (bug) can use constant defined later (#2906) can use constant defined later (#2906) doesn't error if using c enum doesn't error if using c enum 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 (1) finds current type only for first path item (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 (+ 1) errors if using const in var declaration errors if using const in var declaration errors on dynamic constant assignment inside if errors on dynamic constant assignment inside if 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 (true) doesn't errors if constant depends on another one defined later through method, but constant is simple (true) types a constant inside a def types a constant inside a def finds constant in module that includes module (#205) finds constant in module that includes module (#205) 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) types a global constant reference in method types a global constant reference in method finds nearest constant first finds nearest constant first errors if using const in proc notation return type errors if using const in proc notation return type 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) 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 (1) doesn't errors if constant depends on another one defined later through method, but constant is simple (1) errors if can't infer constant type (#3240, #3948) errors if can't infer constant type (#3240, #3948) types a constant reference types a constant reference types a constant using Path types a constant 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) 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 (ZED * 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED * 2) Semantic: concrete_types VirtualType with concrete base VirtualType with concrete base ModuleType ModuleType UnionType of structs UnionType of structs VirtualType with abstract base VirtualType with abstract base VirtualMetaclassType with abstract base VirtualMetaclassType with abstract base VirtualMetaclassType with concrete base VirtualMetaclassType with concrete base GenericModuleInstanceType GenericModuleInstanceType Code gen: hooks 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 does inherited macro recursively does inherited macro recursively does finished does finished fixes empty types in hooks (#3946) fixes empty types in hooks (#3946) does extended macro does extended macro does inherited macro does inherited macro does included macro does included macro Normalize: return next break removes nodes after break removes nodes after break removes nodes after next removes nodes after next 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 return removes nodes after return removes nodes after if that returns in both branches removes nodes after if that returns in both branches Semantic: macro checks if macro expansion returns (#821) checks if macro expansion returns (#821) finds macro in inherited generic class finds macro in inherited generic class clones default value before expanding clones default value before expanding 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 errors if macro uses undefined variable errors if macro uses undefined variable executes MultiAssign with ArrayLiteral value executes MultiAssign with ArrayLiteral value finds generic in macro code finds generic in macro code finds macro through alias (#2706) finds macro through alias (#2706) expands macro with block and argument to yield expands macro with block and argument to yield unpacks block parameters inside macros (#13742) unpacks block parameters inside macros (#13742) show macro trace in errors (1) show macro trace in errors (1) types macro def that calls another method inside a class types macro def that calls another method inside a class errors if macro def type doesn't match found errors if macro def type doesn't match found solves macro expression arguments before macro expansion (type) solves macro expression arguments before macro expansion (type) 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 declares rescue variable inside for macro declares rescue variable inside for macro can define constant via macro included can define constant via macro included matches with default value after splat matches with default value after splat can specify tuple as return type can specify tuple as return type declares variable for macro with out declares variable for macro with out 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) executes MultiAssign executes MultiAssign errors if find macros but missing argument errors if find macros but missing argument shows correct error message in macro expansion (#7083) shows correct error message in macro expansion (#7083) doesn't error when adding macro call to constant (#2457) doesn't error when adding macro call to constant (#2457) executes OpAssign (#9356) executes OpAssign (#9356) finds macro in module in Object finds macro in module in Object finds generic type argument of included module with self finds generic type argument of included module with self finds macro in included module at class level (#4639) finds macro in included module at class level (#4639) can't define new variables (#466) can't define new variables (#466) can use macro in instance var initializer (#7666) can use macro in instance var initializer (#7666) applies visibility modifier only to first level applies visibility modifier only to first level finds macro in included generic module finds macro in included generic module errors if non-existent named arg errors if non-existent named arg errors if missing two arguments errors if missing two arguments types macro def that calls another method types macro def that calls another method allows named args after splat allows named args after splat 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) works inside proc literal (#2984) works inside proc literal (#2984) types macro def that calls another method inside a class types macro def that calls another method inside a class errors when trying to define def inside def with macro expansion errors when trying to define def inside def with macro expansion errors if named arg already specified errors if named arg already specified finds free type vars finds free type vars cannot lookup type defined in caller class cannot lookup type defined in caller class transforms with {{yield}} and call transforms with {{yield}} and call doesn't die on && inside if (bug) doesn't die on && inside if (bug) finds macro and method at the same scope inside included module finds macro and method at the same scope inside included module 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) double splat and regular args double splat and regular args does macro verbatim outside macro does macro verbatim outside macro can return virtual class type in macro def can return virtual class type in macro def allows union return types for macro def allows union return types for macro def expands macro with break inside while (#1852) expands macro with break inside while (#1852) errors if named arg matches single splat parameter errors if named arg matches single splat parameter allows declaring class with macro if allows declaring class with macro if doesn't include parameters with default values in missing arguments error doesn't include parameters with default values in missing arguments error uses bare *, doesn't let more args uses bare *, doesn't let more args allows specifying self as macro def return type allows specifying self as macro def return type can access variable inside macro expansion (#2057) can access variable inside macro expansion (#2057) uses splat and double splat uses splat and double splat expands macro with block expands macro with block allows subclasses of return type for macro def allows subclasses of return type for macro def doesn't crash on syntax error inside macro (regression, #8038) doesn't crash on syntax error inside macro (regression, #8038) errors if requires inside if through macro expansion errors if requires inside if through macro expansion unpacks to underscore within block parameters inside macros unpacks to underscore within block parameters inside macros types macro def with argument types macro def with argument errors if applying protected modifier to macro errors if applying protected modifier to macro uses uninitialized variable with macros uses uninitialized variable with macros assigns to underscore assigns to underscore evaluates yield expression (#2924) evaluates yield expression (#2924) errors if named arg matches splat parameter errors if named arg matches splat parameter errors if missing one argument errors if missing one argument allows declaring class with macro for allows declaring class with macro for show macro trace in errors (2) show macro trace in errors (2) errors if requires inside class through macro expansion errors if requires inside class through macro expansion finds type for global path shared with free var finds type for global path shared with free var allows specifying self as macro def return type (2) allows specifying self as macro def return type (2) can use macro in instance var initializer (just assignment) (#7666) can use macro in instance var initializer (just assignment) (#7666) assigns to underscore in MultiAssign assigns to underscore in MultiAssign finds generic type argument of included module finds generic type argument of included module @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 expands multiline macro expression in verbatim (#6643) expands multiline macro expression in verbatim (#6643) uses bare *, doesn't let more args uses bare *, doesn't let more args says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat allows generic return types for macro def allows generic return types for macro def finds var in proc for macros finds var in proc for macros raise inside macro without node renders both frames (#7147) renders both frames (#7147) supports an empty message (#8631) supports an empty message (#8631) does not contain `expanding macro` does not contain `expanding macro` with node contains the message and not `expanding macro` (#5669) contains the message and not `expanding macro` (#5669) 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) points to caller when missing node location information (#7147) points to caller when missing node location information (#7147) inside method without node renders both frames (#7147) renders both frames (#7147) finds generic in macro code using free var finds generic in macro code using free var gives precise location info when doing yield inside macro gives precise location info when doing yield inside macro types macro def types macro def uses bare * uses bare * finds macro in included module finds macro in included module finds metaclass instance of instance method (#4739) finds metaclass instance of instance method (#4739) errors if macro def type not found errors if macro def type not found types macro types macro allows return values that include the return type of the macro def allows return values that include the return type of the macro def has correct location after expanding assignment after instance var has correct location after expanding assignment after instance var does macro verbatim inside macro does macro verbatim inside macro finds method before macro (#236) finds method before macro (#236) looks up argument types in macro owner, not in subclass (#2395) looks up argument types in macro owner, not in subclass (#2395) 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 finds metaclass instance of instance method (#4639) finds metaclass instance of instance method (#4639) allows declaring class with inline macro expression (#1333) allows declaring class with inline macro expression (#1333) declares multi-assign vars for macro declares multi-assign vars for macro errors if using macro that is defined later errors if using macro that is defined later solves named macro expression arguments before macro expansion (constant) (#2423) solves named macro expression arguments before macro expansion (constant) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) finds macro and method at the same scope finds macro and method at the same scope can return class type in macro def can return class type in macro def errors if find macros but wrong arguments errors if find macros but wrong arguments gets named arguments in double splat gets named arguments in double splat Semantic: require file not found wildcard wildcard relative require relative require require require relative wildcard relative wildcard Codegen: 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 invokes block in const initializes ARGC_UNSAFE initializes ARGC_UNSAFE 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 inlines enum value inlines enum value constants with expression constants with expression declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var initializes simple const via another const initializes simple const via another const 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 finds nearest constant first finds nearest constant first 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) codegens constant that is declared later because of virtual dispatch codegens constant that is declared later because of virtual dispatch inlines char const inlines char 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 inlines simple const inlines simple const 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) 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) 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 inlines const referencing another const inlines const referencing another const initializes simple const initializes simple const support nested constant support nested constant 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 define a constant define a constant 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 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 inlines const with math inlines const with math 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 finds global constant finds global 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 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) inlines bool const inlines bool 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 support constant inside a def support constant inside a def define a constant in lib define a constant in lib supports storing function returning nil supports storing function returning nil 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 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 allows constants with same name allows constants with same name supports closured vars inside initializers (#10474) supports closured vars inside initializers (#10474) Compiler treats all arguments post-filename as program arguments treats all arguments post-filename as program arguments has a valid version has a valid version 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 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 Semantic: struct doesn't make virtual for Value doesn't make virtual for Value errors if defining finalize for struct (#3840) errors if defining finalize for struct (#3840) can't extend class from struct can't extend class from struct doesn't error if method is not found in abstract type doesn't error if method is not found in abstract type unifies type to virtual type unifies type to virtual type can't be nilable can't be nilable can't extend struct from class can't extend struct from class passes subtype check with generic module type on virtual type (2) (#10302) passes subtype check with generic module type on virtual type (2) (#10302) types generic struct declaration types generic struct declaration doesn't make virtual for Float doesn't make virtual for Float can't reopen as class can't reopen as class doesn't make virtual for Int doesn't make virtual for Int types struct declaration types struct declaration doesn't make virtual for Struct doesn't make virtual for Struct passes subtype check with generic module type on virtual type passes subtype check with generic module type on virtual type can't reopen as module can't reopen as module allows struct to participate in virtual allows struct to participate in virtual can't extend struct from non-abstract struct can't extend struct from non-abstract struct can cast to base abstract struct can cast to base abstract struct passes subtype check with generic module type on virtual type (3) passes subtype check with generic module type on virtual type (3) Semantic: pointer errors with non-matching generic value with value=, generic type (#10211) errors with non-matching generic value with value=, generic type (#10211) can assign pointerof virtual type (#8216) can assign pointerof virtual type (#8216) pointer of class raises error pointer of class raises error pointer of value error pointer of value error detects recursive pointerof expansion (3) detects recursive pointerof expansion (3) errors if doing Pointer.allocate errors if doing Pointer.allocate types Pointer.malloc types Pointer.malloc type pointer casting of object type type pointer casting of object type types pointer value types 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 can't do Pointer.malloc without type var can't do Pointer.malloc without type var detects recursive pointerof expansion (4) detects recursive pointerof expansion (4) detects recursive pointerof expansion (#551) (#553) detects recursive pointerof expansion (#551) (#553) pointer malloc creates new type pointer malloc creates new type errors with non-matching generic value with value= (#10211) errors with non-matching generic value with value= (#10211) 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 detects recursive pointerof expansion (2) (#1654) detects recursive pointerof expansion (2) (#1654) create pointer by address create pointer by address types realloc types realloc types pointer add types pointer add type pointer casting type pointer casting types int pointer types int pointer types pointer diff types pointer diff says undefined variable (#7556) says undefined variable (#7556) 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) takes pointerof lib external var takes pointerof lib external var types pointer value on typedef types pointer value on typedef can assign nil to void pointer can assign nil to void pointer allows using pointer with subclass allows using pointer with subclass can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call Code gen: experimental errors if too many arguments errors if too many arguments errors if invalid argument type errors if invalid argument type compiles with no argument compiles with no argument compiles with single string argument compiles with single string argument errors if missing link arguments errors if missing link arguments Semantic: fun errors if defining class inside fun through macro (#6874) errors if defining class inside fun through macro (#6874) Normalize: range literal normalizes exclusive normalizes exclusive normalizes not exclusive normalizes not exclusive Restrictions does not treat single path as free variable when given number (1) (#11859) does not treat single path as free variable when given number (1) (#11859) should not let GenericChild(Base) pass as a GenericBase(Child) (#1294) should not let GenericChild(Base) pass as a GenericBase(Child) (#1294) matches number in bound free variable (#13605) matches number in bound free variable (#13605) works with static array (#637) works with static array (#637) makes metaclass subclass pass parent metaclass restriction (#2079) makes metaclass subclass pass parent metaclass restriction (#2079) restrict restricts generic module instance with class restricts generic module instance with class restricts virtual generic class against uninstantiated generic subclass (2) restricts virtual generic class against uninstantiated generic subclass (2) restricts type with included module restricts type with included module restricts generic module instance with another module restricts generic module instance with another module restricts virtual type with included module 2 restricts virtual type with included module 2 restricts virtual type with included module 1 restricts virtual type with included module 1 restricts virtual generic class against uninstantiated generic subclass (1) restricts virtual generic class against uninstantiated generic subclass (1) restricts class against uninstantiated generic base class through multiple inheritance (2) (#9660) restricts class against uninstantiated generic base class through multiple inheritance (2) (#9660) restricts module through generic include (#4287) restricts module through generic include (#4287) restricts type with superclass restricts type with superclass restricts module with another module restricts module with another module restricts generic module instance with another generic module instance restricts generic module instance with another generic module instance restricts class against uninstantiated generic base class through multiple inheritance (1) (#9660) restricts class against uninstantiated generic base class through multiple inheritance (1) (#9660) restricts type with same type restricts type with same type restricts type with another type restricts type with another type errors if using typeof in block restriction errors if using typeof in block restriction errors if using typeof errors if using typeof errors if using Tuple with named args errors if using Tuple with named args sets number as free variable (#2699) sets number as free variable (#2699) self always matches instance type in restriction self always matches instance type in restriction doesn't error if using Tuple with no args doesn't error if using Tuple with no args works with generic class metaclass vs. generic instance class metaclass works with generic class metaclass vs. generic instance class metaclass restricts virtual metaclass type against metaclass (#3438) restricts virtual metaclass type against metaclass (#3438) errors on T::Type that's a union when used from block type restriction errors on T::Type that's a union when used from block type restriction works with generic class metaclass vs. generic class metaclass works with generic class metaclass vs. generic class metaclass errors if using NamedTuple with positional args errors if using NamedTuple with positional args works with static array that uses underscore works with static array that uses underscore doesn't error if using NamedTuple with no args doesn't error if using NamedTuple with no args works with union against unions of generics works with union against unions of generics errors if using typeof inside generic type errors if using typeof inside generic type errors on T::Type that's union when used from type restriction errors on T::Type that's union when used from type restriction restricts aliased typedef type (#9474) restricts aliased typedef type (#9474) sets number as unbound generic type var (#13110) sets number as unbound generic type var (#13110) errors if using free var without forall errors if using free var without forall self always matches instance type in return type self always matches instance type in return type errors if can't find type on lookup with nested type errors if can't find type on lookup with nested type matches free variable for type variable matches free variable for type variable matches alias against alias in block type matches alias against alias in block type errors if can't find type on lookup errors if can't find type on lookup works with generic compared to fixed (primitive) type works with generic compared to fixed (primitive) type restricts class union type to overloads with classes restricts class union type to overloads with classes does not treat single path as free variable when given number (2) (#11859) does not treat single path as free variable when given number (2) (#11859) passes #278 passes #278 restricts class union type to overloads with classes (2) restricts class union type to overloads with classes (2) restriction_of? Union handles redefinitions (2) (#12330) handles redefinitions (2) (#12330) handles redefinitions (1) (#12330) handles redefinitions (1) (#12330) orders union before generic (#12330) orders union before generic (#12330) Generic vs Generic keeps typed Generic before untyped Generic keeps typed Generic before untyped Generic inserts typed Generic before untyped Generic inserts typed Generic before untyped Generic Path vs Path keeps typed Path before untyped Path keeps typed Path before untyped Path inserts typed Path before untyped Path inserts typed Path before untyped Path Metaclass vs Path inserts metaclass before Value inserts metaclass before Value keeps metaclass before Class keeps metaclass before Class doesn't error if path is undefined and method is not called (2) (#12516) doesn't error if path is undefined and method is not called (2) (#12516) doesn't error if path is undefined and method is not called (1) (#12516) doesn't error if path is undefined and method is not called (1) (#12516) keeps metaclass before Value keeps metaclass before Value keeps metaclass before Object keeps metaclass before Object inserts metaclass before Object inserts metaclass before Object inserts metaclass before Class inserts metaclass before Class free variables inserts path before free variable with same name inserts path before free variable with same name keeps path before free variable with same name keeps path before free variable with same name inserts path before free variable even if free var resolves to a more specialized type inserts path before free variable even if free var resolves to a more specialized type keeps constant before free variable with same name keeps constant before free variable with same name inserts constant before free variable with same name inserts constant before free variable with same name keeps path before free variable even if free var resolves to a more specialized type keeps path before free variable even if free var resolves to a more specialized type Generic vs Path keeps typed Generic before untyped Path keeps typed Generic before untyped Path keeps untyped Generic before untyped Path keeps untyped Generic before untyped Path inserts typed Generic before untyped Path inserts typed Generic before untyped Path inserts untyped Generic before untyped Path (2) inserts untyped Generic before untyped Path (2) inserts untyped Generic before untyped Path inserts untyped Generic before untyped Path Metaclass vs Metaclass inserts typed Metaclass before untyped Metaclass inserts typed Metaclass before untyped Metaclass keeps typed Metaclass before untyped Metaclass keeps typed Metaclass before untyped Metaclass NamedTuple vs NamedTuple inserts more specialized NamedTuple before less specialized one inserts more specialized NamedTuple before less specialized one doesn't mix incompatible NamedTuples (#10238) doesn't mix incompatible NamedTuples (#10238) keeps more specialized NamedTuple before less specialized one keeps more specialized NamedTuple before less specialized one Underscore vs Path keeps underscore after Path (#12854) keeps underscore after Path (#12854) inserts Path before underscore (#12854) inserts Path before underscore (#12854) works with splats and modules, under -Dpreview_overload_order (#12854) works with splats and modules, under -Dpreview_overload_order (#12854) Path vs NumberLiteral inserts constant before number literal of same value with generic arguments inserts constant before number literal of same value with generic arguments inserts number literal before constant of same value with generic arguments inserts number literal before constant of same value with generic arguments GenericClassType vs GenericClassInstanceType works with classes in different namespaces works with classes in different namespaces keeps GenericClassInstanceType before GenericClassType keeps GenericClassInstanceType before GenericClassType inserts GenericClassInstanceType before GenericClassType inserts GenericClassInstanceType before GenericClassType doesn't mix different generic classes doesn't mix different generic classes matches virtual type against alias matches virtual type against alias allows passing recursive type to free var (#1076) allows passing recursive type to free var (#1076) errors if using typeof in block restriction errors if using typeof in block restriction Semantic: initialize finishes when analyzing recursive calls finishes when analyzing recursive calls 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 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 used after method call that reads var types instance var as nilable if used after method call that reads var 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 types instance var as nilable if used before assignment types instance var as nilable if used before assignment 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 errors on default new when using named arguments (#2245) errors on default new when using named arguments (#2245) 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 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) marks instance variable as nilable in initialize if using self in method marks instance variable as nilable in initialize if using self in method 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 marks instance variable as nilable when using self in super marks instance variable as nilable when using self in super marks instance variable as nilable in initialize if using self marks instance variable as nilable in initialize if using self types instance var as nilable if assigned in block types instance var as nilable if assigned in block 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 doesn't type instance var as nilable if out doesn't type instance var as nilable if out types instance vars as nilable if doesn't invoke super in initialize types instance vars as nilable if doesn't invoke super in initialize marks instance variable as nilable in initialize if assigning self marks instance variable as nilable in initialize if assigning self 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 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) 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 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 initializer of recursive generic type types initializer of recursive generic type doesn't mark instance variable as nilable when using self.class doesn't mark instance variable as nilable when using self.class 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 not always assigned types instance var as nilable if not always assigned 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) 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 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 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 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) checks instance vars of included modules checks instance vars of included modules types initializer of generic type after instantiated types initializer of generic type after instantiated Semantic: new evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) doesn't incorrectly redefines new for generic class doesn't incorrectly redefines new for generic class 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 (2) (#731) evaluates initialize default value at the instance scope (2) (#731) errors if using self call in default argument (1) errors if using self call in default argument (1) 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 (1) (#731) evaluates initialize default value at the instance scope (1) (#731) 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 (6) (#731) evaluates initialize default value at the instance scope (6) (#731) errors if using self call in default argument (2) errors if using self call in default argument (2) doesn't have default new for inherited class from generic type doesn't have default new for inherited class from generic type inherits initialize and new methods if doesn't define new (#3238) inherits initialize and new methods if doesn't define new (#3238) Crystal::Repl::Interpreter symbol Symbol#to_s Symbol#to_s Symbol#to_i Symbol#to_i symbol equality symbol equality Crystal::Repl::Interpreter conversion interprets UInt8::MAX#to_u64! interprets UInt8::MAX#to_u64! interprets Float64#to_u8! (positive) interprets Float64#to_u8! (positive) interprets UInt32::MAX#to_f64! interprets UInt32::MAX#to_f64! interprets UInt16::MAX#to_u8! interprets UInt16::MAX#to_u8! interprets Int16::MIN#to_i16! interprets Int16::MIN#to_i16! interprets Float32#to_i16! (negative) interprets Float32#to_i16! (negative) interprets Int16::MIN#to_f32! interprets Int16::MIN#to_f32! interprets Float32#to_u64! (positive) interprets Float32#to_u64! (positive) interprets Float64#to_u64! (positive) interprets Float64#to_u64! (positive) interprets Int16::MAX#to_u8! interprets Int16::MAX#to_u8! interprets Int16::MIN#to_i8! interprets Int16::MIN#to_i8! interprets Float64#to_i32! (positive) interprets Float64#to_i32! (positive) interprets Int32::MAX#to_i! interprets Int32::MAX#to_i! interprets Float32#to_u32! (positive) interprets Float32#to_u32! (positive) interprets Char#ord interprets Char#ord interprets UInt16::MAX#to_i32! interprets UInt16::MAX#to_i32! interprets UInt64::MAX#to_u8! interprets UInt64::MAX#to_u8! interprets Float64#to_u! (positive) interprets Float64#to_u! (positive) interprets Int16::MAX#to_i16! interprets Int16::MAX#to_i16! interprets Float64#to_i8! (negative) interprets Float64#to_i8! (negative) interprets Int16::MAX#to_i64! interprets Int16::MAX#to_i64! interprets Float32#to_i! (negative) interprets Float32#to_i! (negative) interprets Int64::MIN#to_f64! interprets Int64::MIN#to_f64! interprets UInt32::MAX#to_u64! interprets UInt32::MAX#to_u64! interprets Int16::MIN#to_u! interprets Int16::MIN#to_u! interprets Int64::MIN#to_f32! interprets Int64::MIN#to_f32! interprets UInt8::MAX#to_i32! interprets UInt8::MAX#to_i32! interprets UInt64::MAX#to_u64! interprets UInt64::MAX#to_u64! interprets Float32#to_f32! (positive) interprets Float32#to_f32! (positive) interprets Float64#to_i64! (positive) interprets Float64#to_i64! (positive) interprets Float32#to_i64! (positive) interprets Float32#to_i64! (positive) interprets Int64::MAX#to_f64! interprets Int64::MAX#to_f64! interprets Float32#to_i8! (positive) interprets Float32#to_i8! (positive) interprets Int8::MIN#to_f64! interprets Int8::MIN#to_f64! interprets UInt32::MAX#to_f32! interprets UInt32::MAX#to_f32! interprets UInt16::MAX#to_i! interprets UInt16::MAX#to_i! interprets Int8::MAX#to_i16! interprets Int8::MAX#to_i16! interprets UInt64::MAX#to_u16! interprets UInt64::MAX#to_u16! interprets Int32::MAX#to_i8! interprets Int32::MAX#to_i8! interprets UInt8::MAX#to_f64! interprets UInt8::MAX#to_f64! interprets UInt16::MAX#to_i8! interprets UInt16::MAX#to_i8! interprets Float64#to_i16! (positive) interprets Float64#to_i16! (positive) interprets Int32::MIN#to_f64! interprets Int32::MIN#to_f64! interprets UInt64::MAX#to_u! interprets UInt64::MAX#to_u! interprets Int16::MAX#to_u16! interprets Int16::MAX#to_u16! interprets Int16::MIN#to_i! interprets Int16::MIN#to_i! interprets Float32#to_f32! (negative) interprets Float32#to_f32! (negative) interprets Int64::MIN#to_u64! interprets Int64::MIN#to_u64! interprets UInt32::MAX#to_i! interprets UInt32::MAX#to_i! interprets Int16::MAX#to_i8! interprets Int16::MAX#to_i8! interprets UInt64::MAX#to_u32! interprets UInt64::MAX#to_u32! UInt8#unsafe_chr UInt8#unsafe_chr interprets Float32#to_i8! (negative) interprets Float32#to_i8! (negative) interprets UInt32::MAX#to_u32! interprets UInt32::MAX#to_u32! interprets Int32::MAX#to_i16! interprets Int32::MAX#to_i16! interprets UInt64::MAX#to_i! interprets UInt64::MAX#to_i! interprets Int32::MIN#to_i64! interprets Int32::MIN#to_i64! interprets Int64::MAX#to_i! interprets Int64::MAX#to_i! interprets Int8::MIN#to_i8! interprets Int8::MIN#to_i8! interprets Int64::MIN#to_i64! interprets Int64::MIN#to_i64! interprets Float32#to_u! (positive) interprets Float32#to_u! (positive) interprets Float64#to_f64! (positive) interprets Float64#to_f64! (positive) interprets Int32::MIN#to_u! interprets Int32::MIN#to_u! interprets Int64::MIN#to_i8! interprets Int64::MIN#to_i8! interprets Int8::MIN#to_i32! interprets Int8::MIN#to_i32! interprets Int32::MAX#to_u8! interprets Int32::MAX#to_u8! interprets Int16::MIN#to_u8! interprets Int16::MIN#to_u8! interprets UInt16::MAX#to_i64! interprets UInt16::MAX#to_i64! interprets Int8::MAX#to_i8! interprets Int8::MAX#to_i8! interprets UInt16::MAX#to_u! interprets UInt16::MAX#to_u! interprets Float32#to_i! (positive) interprets Float32#to_i! (positive) interprets Int64::MIN#to_u8! interprets Int64::MIN#to_u8! interprets Int16::MIN#to_f64! interprets Int16::MIN#to_f64! interprets UInt8::MAX#to_i16! interprets UInt8::MAX#to_i16! interprets Int8::MAX#to_i64! interprets Int8::MAX#to_i64! interprets Int32::MAX#to_i64! interprets Int32::MAX#to_i64! interprets Float32#to_f64! (negative) interprets Float32#to_f64! (negative) interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_f32! interprets Float64#to_i8! (positive) interprets Float64#to_i8! (positive) interprets Float64#to_i32! (negative) interprets Float64#to_i32! (negative) interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u16! interprets UInt64::MAX#to_i64! interprets UInt64::MAX#to_i64! interprets Int16::MIN#to_i64! interprets Int16::MIN#to_i64! interprets Int64::MAX#to_u16! interprets Int64::MAX#to_u16! interprets Int16::MAX#to_i32! interprets Int16::MAX#to_i32! interprets Int8::MIN#to_u! interprets Int8::MIN#to_u! interprets Float32#to_u8! (positive) interprets Float32#to_u8! (positive) interprets UInt16::MAX#to_u64! interprets UInt16::MAX#to_u64! interprets Int32::MIN#to_u16! interprets Int32::MIN#to_u16! interprets UInt16::MAX#to_f32! interprets UInt16::MAX#to_f32! interprets Float64#to_f64! (negative) interprets Float64#to_f64! (negative) interprets UInt32::MAX#to_i32! interprets UInt32::MAX#to_i32! interprets UInt64::MAX#to_f64! interprets UInt64::MAX#to_f64! interprets UInt32::MAX#to_i64! interprets UInt32::MAX#to_i64! interprets Float64#to_u16! (positive) interprets Float64#to_u16! (positive) interprets Int8::MAX#to_u64! interprets Int8::MAX#to_u64! interprets Float32#to_i32! (negative) interprets Float32#to_i32! (negative) interprets Int16::MAX#to_f32! interprets Int16::MAX#to_f32! interprets Int8::MAX#to_u! interprets Int8::MAX#to_u! interprets Int8::MIN#to_u64! interprets Int8::MIN#to_u64! interprets Int32::MIN#to_u32! interprets Int32::MIN#to_u32! interprets Int32::MIN#to_f32! interprets Int32::MIN#to_f32! interprets Int32::MIN#to_i32! interprets Int32::MIN#to_i32! interprets Int32::MAX#to_u32! interprets Int32::MAX#to_u32! interprets UInt8::MAX#to_u8! interprets UInt8::MAX#to_u8! interprets Int8::MIN#to_i! interprets Int8::MIN#to_i! interprets Int64::MIN#to_u! interprets Int64::MIN#to_u! interprets Int64::MAX#to_i8! interprets Int64::MAX#to_i8! interprets Float64#to_u32! (positive) interprets Float64#to_u32! (positive) interprets Int64::MAX#to_u64! interprets Int64::MAX#to_u64! interprets Int32::MAX#to_f32! interprets Int32::MAX#to_f32! interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u8! interprets Int8::MAX#to_u8! interprets Int16::MIN#to_u64! interprets Int16::MIN#to_u64! interprets Int16::MIN#to_u16! interprets Int16::MIN#to_u16! interprets UInt8::MAX#to_i64! interprets UInt8::MAX#to_i64! interprets UInt16::MAX#to_u16! interprets UInt16::MAX#to_u16! discards conversion discards conversion interprets Int64::MAX#to_i64! interprets Int64::MAX#to_i64! interprets Int64::MIN#to_u16! interprets Int64::MIN#to_u16! Int32#unsafe_chr Int32#unsafe_chr interprets Int8::MIN#to_u8! interprets Int8::MIN#to_u8! interprets Float64#to_f32! (positive) interprets Float64#to_f32! (positive) interprets Int64::MAX#to_u! interprets Int64::MAX#to_u! interprets UInt8::MAX#to_i8! interprets UInt8::MAX#to_i8! interprets UInt32::MAX#to_u8! interprets UInt32::MAX#to_u8! interprets Int8::MIN#to_u32! interprets Int8::MIN#to_u32! interprets Int32::MIN#to_i16! interprets Int32::MIN#to_i16! interprets Float64#to_i! (negative) interprets Float64#to_i! (negative) interprets UInt16::MAX#to_u32! interprets UInt16::MAX#to_u32! interprets Int32::MAX#to_u! interprets Int32::MAX#to_u! interprets Int16::MAX#to_u32! interprets Int16::MAX#to_u32! interprets Int16::MIN#to_i32! interprets Int16::MIN#to_i32! interprets Int32::MIN#to_i! interprets Int32::MIN#to_i! interprets Int64::MIN#to_i32! interprets Int64::MIN#to_i32! interprets Int8::MIN#to_i64! interprets Int8::MIN#to_i64! interprets Int64::MAX#to_u8! interprets Int64::MAX#to_u8! interprets UInt8::MAX#to_i! interprets UInt8::MAX#to_i! interprets UInt16::MAX#to_f64! interprets UInt16::MAX#to_f64! interprets Float32#to_f64! (positive) interprets Float32#to_f64! (positive) interprets Int64::MAX#to_i32! interprets Int64::MAX#to_i32! interprets Float64#to_f32! (negative) interprets Float64#to_f32! (negative) interprets Int16::MIN#to_u32! interprets Int16::MIN#to_u32! interprets Int32::MAX#to_u16! interprets Int32::MAX#to_u16! interprets Int8::MAX#to_u32! interprets Int8::MAX#to_u32! interprets Float32#to_u16! (positive) interprets Float32#to_u16! (positive) interprets Int32::MAX#to_u64! interprets Int32::MAX#to_u64! interprets Int64::MIN#to_u32! interprets Int64::MIN#to_u32! interprets Int16::MAX#to_u64! interprets Int16::MAX#to_u64! interprets Int8::MAX#to_f32! interprets Int8::MAX#to_f32! interprets UInt8::MAX#to_u! interprets UInt8::MAX#to_u! interprets UInt64::MAX#to_f32! interprets UInt64::MAX#to_f32! interprets UInt64::MAX#to_i16! interprets UInt64::MAX#to_i16! interprets Int32::MIN#to_u64! interprets Int32::MIN#to_u64! interprets UInt32::MAX#to_u! interprets UInt32::MAX#to_u! interprets Int16::MAX#to_f64! interprets Int16::MAX#to_f64! interprets Int8::MIN#to_i16! interprets Int8::MIN#to_i16! interprets Int8::MAX#to_f64! interprets Int8::MAX#to_f64! interprets Int32::MIN#to_u8! interprets Int32::MIN#to_u8! interprets Float32#to_i64! (negative) interprets Float32#to_i64! (negative) interprets Int16::MAX#to_u! interprets Int16::MAX#to_u! interprets Int32::MIN#to_i8! interprets Int32::MIN#to_i8! interprets Int8::MIN#to_f32! interprets Int8::MIN#to_f32! interprets Float64#to_i64! (negative) interprets Float64#to_i64! (negative) interprets Int64::MIN#to_i! interprets Int64::MIN#to_i! interprets UInt8::MAX#to_u16! interprets UInt8::MAX#to_u16! interprets UInt64::MAX#to_i32! interprets UInt64::MAX#to_i32! interprets Int64::MAX#to_u32! interprets Int64::MAX#to_u32! interprets Int64::MIN#to_i16! interprets Int64::MIN#to_i16! interprets Int32::MAX#to_i32! interprets Int32::MAX#to_i32! interprets UInt64::MAX#to_i8! interprets UInt64::MAX#to_i8! interprets Int32::MAX#to_f64! interprets Int32::MAX#to_f64! interprets Int8::MIN#to_u16! interprets Int8::MIN#to_u16! interprets Int8::MAX#to_i32! interprets Int8::MAX#to_i32! interprets Int64::MAX#to_i16! interprets Int64::MAX#to_i16! interprets UInt32::MAX#to_i16! interprets UInt32::MAX#to_i16! interprets UInt16::MAX#to_i16! interprets UInt16::MAX#to_i16! interprets Float32#to_i32! (positive) interprets Float32#to_i32! (positive) interprets Float64#to_i16! (negative) interprets Float64#to_i16! (negative) interprets Int16::MAX#to_i! interprets Int16::MAX#to_i! interprets Float32#to_i16! (positive) interprets Float32#to_i16! (positive) discards conversion with local var discards conversion with local var interprets Float64#to_i! (positive) interprets Float64#to_i! (positive) interprets Int64::MAX#to_f32! interprets Int64::MAX#to_f32! interprets Int8::MAX#to_i! interprets Int8::MAX#to_i! interprets UInt8::MAX#to_u32! interprets UInt8::MAX#to_u32! math interprets Int32 + Float64 interprets Int32 + Float64 interprets Float64 - Float64 interprets Float64 - Float64 interprets UInt8 | Int32 interprets UInt8 | Int32 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 Int64 + Int64 interprets Int64 + Int64 interprets Float64 + Float64 interprets Float64 + Float64 interprets UInt64 * Int32 interprets UInt64 * Int32 interprets Int32 &* Int32 interprets Int32 &* Int32 interprets UInt64 | UInt32 interprets UInt64 | UInt32 interprets Float64 + Int32 interprets Float64 + Int32 interprets Float64 * Float64 interprets Float64 * Float64 interprets Int8 + Int8 interprets Int8 + Int8 interprets Int32 * Int32 interprets Int32 * Int32 interprets Int32 &+ Int32 interprets Int32 &+ Int32 interprets Int32.unsafe_shl(Int32) with self interprets Int32.unsafe_shl(Int32) with self interprets Int128 + Int32 interprets Int128 + Int32 interprets Int32 + Int32 interprets Int32 + Int32 discards math discards math interprets UInt32 - Int32 interprets UInt32 - Int32 overflow conversion overlows on 2147483648_u64.to_i32 overlows on 2147483648_u64.to_i32 overlows on -1_i16.to_u16 overlows on -1_i16.to_u16 overlows on -1_i8.to_u32 overlows on -1_i8.to_u32 overlows on -1_i64.to_u32 overlows on -1_i64.to_u32 overlows on -1_i16.to_u32 overlows on -1_i16.to_u32 overlows on 32768_f64.to_i16 overlows on 32768_f64.to_i16 overlows on -1_i16.to_u8 overlows on -1_i16.to_u8 overlows on 32768_u16.to_i16 overlows on 32768_u16.to_i16 overlows on -1.to_u32 overlows on -1.to_u32 overlows on -1_i8.to_u16 overlows on -1_i8.to_u16 overlows on -1_i64.to_u64 overlows on -1_i64.to_u64 overlows on 9223372036854775808_u64.to_i64 overlows on 9223372036854775808_u64.to_i64 overlows on -1.to_u64 overlows on -1.to_u64 overlows on 128_f64.to_i8 overlows on 128_f64.to_i8 overlows on 256_f64.to_u8 overlows on 256_f64.to_u8 overlows on 256_f32.to_u8 overlows on 256_f32.to_u8 overlows on 1.7976931348623157e+308.to_f32 overlows on 1.7976931348623157e+308.to_f32 overlows on 128_u64.to_i8 overlows on 128_u64.to_i8 overlows on 32768_f32.to_i16 overlows on 32768_f32.to_i16 overlows on 4294967296_f64.to_u32 overlows on 4294967296_f64.to_u32 overlows on -1_i8.to_u8 overlows on -1_i8.to_u8 overlows on 32768_u64.to_i16 overlows on 32768_u64.to_i16 overlows on 65536_f32.to_u16 overlows on 65536_f32.to_u16 overlows on -1_i16.to_u64 overlows on -1_i16.to_u64 overlows on -1_i8.to_u64 overlows on -1_i8.to_u64 overlows on 128_f32.to_i8 overlows on 128_f32.to_i8 overlows on -1.to_u16 overlows on -1.to_u16 overlows on 128_u8.to_i8 overlows on 128_u8.to_i8 overlows on -1_i64.to_u8 overlows on -1_i64.to_u8 overlows on 2147483648_u32.to_i32 overlows on 2147483648_u32.to_i32 overlows on 32768_u32.to_i16 overlows on 32768_u32.to_i16 overlows on 128_u32.to_i8 overlows on 128_u32.to_i8 overlows on 2147483648_f64.to_i32 overlows on 2147483648_f64.to_i32 overlows on -1.to_u8 overlows on -1.to_u8 overlows on -1_i64.to_u16 overlows on -1_i64.to_u16 overlows on 65536_f64.to_u16 overlows on 65536_f64.to_u16 overlows on 128_u16.to_i8 overlows on 128_u16.to_i8 * overlows on 10_u16 * 6600 overlows on 10_u16 * 6600 overlows on 20 * 214748364 overlows on 20 * 214748364 overlows on 20_u64 * 1844674407370955161_i64 overlows on 20_u64 * 1844674407370955161_i64 overlows on 20_u32 * 429496729 overlows on 20_u32 * 429496729 overlows on 10_i16 * 3300 overlows on 10_i16 * 3300 overlows on 20_i64 * 922337203685477580_i64 overlows on 20_i64 * 922337203685477580_i64 overlows on 10_i8 * 14 overlows on 10_i8 * 14 overlows on 10_u8 * 26 overlows on 10_u8 * 26 - overlows on 1_i64 - 9223372036854775810_u64 overlows on 1_i64 - 9223372036854775810_u64 overlows on 1_u64 - 2 overlows on 1_u64 - 2 overlows on 1 - 2147483650_i64 overlows on 1 - 2147483650_i64 overlows on 1_i8 - 256 overlows on 1_i8 - 256 overlows on 1_u8 - 2 overlows on 1_u8 - 2 overlows on 1_u16 - 2 overlows on 1_u16 - 2 overlows on 1_u32 - 2 overlows on 1_u32 - 2 overlows on 1_i16 - 32770 overlows on 1_i16 - 32770 + overlows on 1_i8 + 128 overlows on 1_i8 + 128 overlows on 1 + 2147483647 overlows on 1 + 2147483647 overlows on 1_u16 + 65535 overlows on 1_u16 + 65535 overlows on 1_u8 + 255 overlows on 1_u8 + 255 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_i16 + 32767 overlows on 1_i16 + 32767 overlows on 1_u64 + 18446744073709551615_u64 overlows on 1_u64 + 18446744073709551615_u64 logical operations discards bool not discards bool not interprets not for nil interprets not for nil 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 mixed union (other) interprets not for mixed union (other) interprets not for generic module interprets not for generic module interprets not for bool false interprets not for bool false interprets not for nilable proc type (false) interprets not for nilable proc type (false) interprets not for mixed union (nil) interprets not for mixed union (nil) interprets not for generic class instance type interprets not for generic class instance type does math convert on union does math convert on union does math primitive on union does math primitive on union interprets not for nilable type (true) interprets not for nilable type (true) interprets not for nil type interprets not for nil type interprets not for mixed union (false) interprets not for mixed union (false) interprets not for generic module metaclass interprets not for generic module metaclass 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 type (false) interprets not for nilable type (false) interprets not for module (#12918) interprets not for module (#12918) interprets not for bool true interprets not for bool true discards nil not discards nil not interprets not for nilable proc type (true) interprets not for nilable proc type (true) interprets not for mixed union (true) interprets not for mixed union (true) local variables interprets variable set and get with operations interprets variable set and get with operations interprets variable set and get, second local var interprets variable set and get, second local var interprets at the class level interprets at the class level interprets variable set and get interprets variable set and get doesn't declare variable with no type inside method doesn't declare variable with no type inside method doesn't declare variable with no type doesn't declare variable with no type interprets variable set interprets variable set interprets local variable declaration (#12229) interprets local variable declaration (#12229) assigns to underscore assigns to underscore doesn't discard underscore right hand side doesn't discard underscore right hand side interprets variable set with type restriction (#13023) interprets variable set with type restriction (#13023) interprets uninitialized interprets uninitialized literals interprets an Int32 interprets an Int32 interprets a bool (false) interprets a bool (false) interprets a Float32 interprets a Float32 interprets an Int8 interprets an Int8 precomputes string literal length precomputes string literal length uses a string pool uses a string pool interprets a Float64 interprets a Float64 interprets an UInt16 interprets an UInt16 interprets an UInt64 interprets an UInt64 interprets an Int128 interprets an Int128 interprets an UInt8 interprets an UInt8 interprets a String literal interprets a String literal interprets an Int64 interprets an Int64 interprets an UInt32 interprets an UInt32 interprets a bool (true) interprets a bool (true) interprets a char interprets a char interprets nil interprets nil interprets an Int16 interprets an Int16 interprets an UInt128 interprets an UInt128 comparisons interprets Int32 != UInt64 (true) interprets Int32 != UInt64 (true) interprets Int32 > Float64 (false) interprets Int32 > Float64 (false) discards comparison discards comparison interprets UInt64 > UInt32 (true) interprets UInt64 > UInt32 (true) interprets Float32 / Float32 interprets Float32 / Float32 interprets Bool != Bool (false) interprets Bool != Bool (false) interprets UInt64 != Int32 (false) interprets UInt64 != Int32 (false) interprets Int32 == UInt64 (false) interprets Int32 == UInt64 (false) interprets UInt32 < Int32 (false) interprets UInt32 < Int32 (false) interprets UInt64 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is less than zero) interprets UInt8 < Int32 (false, right is greater than zero) interprets UInt8 < Int32 (false, right is greater than zero) interprets Int32 == Int32 (true) interprets Int32 == Int32 (true) interprets Int32 == Float64 (false) interprets Int32 == Float64 (false) interprets Float64 < Float64 interprets Float64 < Float64 interprets UInt64 == Int32 (false when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 >= 0) interprets UInt8 < Int32 (false, right is less than zero) interprets UInt8 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is greater than zero) interprets UInt64 < Int32 (false, right is greater than zero) interprets Bool == Bool (false) interprets Bool == Bool (false) interprets UInt64 > UInt32 (false) interprets UInt64 > UInt32 (false) interprets Int32 != UInt64 (false) interprets Int32 != UInt64 (false) interprets UInt64 != Int32 (true) interprets UInt64 != Int32 (true) interprets Float32 / Int32 interprets Float32 / Int32 interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (true when Int32 >= 0) interprets Char == Char (true) interprets Char == Char (true) interprets Float32 fdiv Float64 interprets Float32 fdiv Float64 interprets Float64 / Float64 interprets Float64 / Float64 interprets Float64 fdiv Float32 interprets Float64 fdiv Float32 interprets UInt64.unsafe_mod(UInt64) interprets UInt64.unsafe_mod(UInt64) interprets Bool == Bool (true) interprets Bool == Bool (true) interprets Float64 < Int32 interprets Float64 < Int32 interprets UInt8 < Int32 (true, right is greater than zero) interprets UInt8 < Int32 (true, right is greater than zero) interprets Int128 == Int128 (false) interprets Int128 == Int128 (false) interprets Int32 < Float64 interprets Int32 < Float64 interprets Char == Char (false) interprets Char == Char (false) interprets Int32 < Int32 interprets Int32 < Int32 interprets Int32 == UInt64 (true) interprets Int32 == UInt64 (true) interprets Int32 > Float64 (true) interprets Int32 > Float64 (true) interprets Int32 != Int32 (false) interprets Int32 != Int32 (false) interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 == Int32 (false when Int32 < 0) interprets UInt64 == Int32 (false when Int32 < 0) interprets Int32 == Int32 (false) interprets Int32 == Int32 (false) interprets Bool != Bool (true) interprets Bool != Bool (true) interprets Int128 == Int128 (true) interprets Int128 == Int128 (true) interprets UInt32 < Int32 (true) interprets UInt32 < Int32 (true) interprets Int32 == Float64 (true) interprets Int32 == Float64 (true) interprets Int32 != Int32 (true) interprets Int32 != Int32 (true) Code gen: C ABI 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) 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) 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 (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 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) 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 (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) 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) 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) 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 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) 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) 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: new evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) codegens instance method with new codegens instance method with new inherits initialize for generic type inherits initialize for generic type codegens instance method with new and instance var codegens instance method with new and instance var evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) finds new in superclass if no initialize is defined (2) finds new in superclass if no initialize is defined (2) codegens instance method with allocate codegens instance method with allocate inherits initialize inherits initialize overloads new and initialize, 3 (#2489) overloads new and initialize, 3 (#2489) can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new can create Tuple with Tuple.new finds new in superclass for Enum finds new in superclass for Enum finds new in superclass if no initialize is defined (1) finds new in superclass if no initialize is defined (1) overloads new and initialize, 2 (#2489) overloads new and initialize, 2 (#2489) defines new for module defines new for module evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (4) (#731) finds super in deep hierarchy finds super in deep hierarchy evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) can create Reference can create Reference overloads new and initialize, 1 (#2489) overloads new and initialize, 1 (#2489) Crystal::Repl::Interpreter blocks interprets yield return value interprets yield return value interprets with ... yield interprets with ... yield interprets block with splat interprets block with splat interprets yield inside def with arguments interprets yield inside def with arguments 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) yields different values to form a union yields different values to form a union interprets yield with splat, block with splat (#12227) interprets yield with splat, block with splat (#12227) interprets yield expression interprets yield expression interprets break inside block (union, through return) interprets break inside block (union, through return) interprets with ... yield with struct interprets with ... yield with struct interprets yield with splat (1) interprets yield with splat (1) considers block arg without type as having NoReturn type (#12270) considers block arg without type as having NoReturn type (#12270) interprets next inside block interprets next inside block caches method with captured block (#12276) caches method with captured block (#12276) interprets with ... yield with extra arguments (#12296) interprets with ... yield with extra arguments (#12296) counts with ... yield scope in block args bytesize (#12316) counts with ... yield scope in block args bytesize (#12316) interprets block with args that conflict with a local var interprets block with args that conflict with a local var interprets break inside block (union, through break) interprets break inside block (union, through break) considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (2) (#12270) captures non-closure block captures non-closure block interprets block with args that conflict with a local var interprets block with args that conflict with a local var interprets break inside block interprets break inside block interprets yield inside another block interprets yield inside another block interprets block with multiple yields interprets block with multiple yields interprets next inside block (union, through next) interprets next inside block (union, through next) interprets yield with splat (2) interprets yield with splat (2) interprets yield expressions interprets yield expressions interprets break inside block (union, through normal flow) interprets break inside block (union, through normal flow) interprets yield with splat, block with splat interprets yield with splat, block with splat returns from block returns from block casts yield expression to block var type (not block arg type) casts yield expression to block var type (not block arg type) discards yield expression discards yield expression clears block local variables when calling block clears block local variables when calling block interprets simplest block interprets simplest block interprets yield with splat, less block arguments interprets yield with splat, less block arguments Semantic: ssa 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 while and used in condition types a var that is re-assigned in a while and used in condition types a var with an if but without change types a var with an if but without change 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 restricted type in then types if with restricted type in then types if with return in else types if with return in else types a var inside an if without definition in else types a var inside an if without definition in else preserves type filters after block (bug) preserves type filters after block (bug) types a var that is declared in a while types a var that is declared in a while types while with break types while with break types a var with an if with nested if types a var with an if with nested if types a var inside an if with previous definition types a var inside an if with previous definition types if with return in then types if with return in then types a var that is declared in a while condition types a var that is declared in a while condition types block with break types block with break types while with break with new var types while with break with new var types a var that is declared in a while with out types a var that is declared in a while with out types a var that is re-assigned in a while condition types a var that is re-assigned in a while condition 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 while with break doesn't infect initial vars types while with break doesn't infect initial vars types if with unreachable in then types if with unreachable in then types if with next in then types if with next in then types if with break in then types if with break in then types a var inside an if without previous definition types a var inside an if without previous definition types if/else with var (bug) types if/else with var (bug) types block with break doesn't infect initial vars types block with break doesn't infect initial vars types re-assign inside while (bug) types re-assign inside while (bug) 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 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 types block with next types block with next types a var that is re-assigned in a block types a var that is re-assigned in a block 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 while with next types while with next types a var after begin ensure as having last type types a var after begin ensure as having last type errors if accessing variable declared inside typeof errors if accessing variable declared inside typeof types if with return in both branches types if with return in both branches 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 a redefined variable types a redefined variable types a var inside an if without change in else types a var inside an if without change in else 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 types a var that is re-assigned in a while types if with restricted type in else types if with restricted type in else types a var after begin ensure as having last type (2) types a var after begin ensure as having last type (2) Call errors says type mismatch for symbol against enum (list all possibilities when 10 or less) says type mismatch for symbol against enum (list all possibilities when 10 or less) errors on argument if more types are given than expected errors on argument if more types are given than expected says type mismatch for named argument says type mismatch for named argument says type mismatch for symbol against enum (did you mean) says type mismatch for symbol against enum (did you mean) replaces generic type var in named argument replaces generic type var in named argument says not expected to be invoked with a block says not expected to be invoked with a block says no parameter named says no parameter named says expected to be invoked with a block says expected to be invoked with a block says no parameters named says no parameters named says type mismatch for positional argument says type mismatch for positional argument replaces free variables in named argument replaces free variables in named argument method signatures in error traces expands positional and double splat argument expands positional and double splat argument expands positional and single splat argument, empty tuple expands positional and single splat argument, empty tuple expands single splat argument expands single splat argument expands positional and single splat argument expands positional and single splat argument expands double splat argument, empty named tuple expands double splat argument, empty named tuple expands single splat argument, more elements expands single splat argument, more elements expands double splat argument expands double splat argument uses `T.method` instead of `T.class#method` uses `T.method` instead of `T.class#method` expands positional and double splat argument, empty named tuple expands positional and double splat argument, empty named tuple includes named argument includes named argument includes positional and named argument includes positional and named argument expands single splat argument, empty tuple expands single splat argument, empty tuple includes named arguments includes named arguments expands positional and double splat argument, more elements expands positional and double splat argument, more elements expands positional and single splat argument, more elements expands positional and single splat argument, more elements uses `T.method` instead of `T:module#method` uses `T.method` instead of `T:module#method` expands double splat argument, more elements expands double splat argument, more elements says type mismatch for positional argument with three options says type mismatch for positional argument with three options says missing named argument says missing named argument replaces free variables in positional argument replaces free variables in positional argument errors on argument if more types are given than expected, shows all expected types errors on argument if more types are given than expected, shows all expected types says argument already specified says argument already specified says wrong number of arguments even if other overloads don't match by block says wrong number of arguments even if other overloads don't match by block says wrong number of arguments (to few arguments) says wrong number of arguments (to few arguments) errors on argument if argument matches in all overloads but with different types in other arguments errors on argument if argument matches in all overloads but with different types in other arguments says type mismatch for symbol against enum, named argument case says type mismatch for symbol against enum, named argument case says type mismatch for positional argument with two options says type mismatch for positional argument with two options says missing named arguments says missing named arguments replaces generic type var in positional argument replaces generic type var in positional argument says type mismatch for positional argument even if there are overloads that don't match says type mismatch for positional argument even if there are overloads that don't match error reporting uses correct name for top-level macro methods uses correct name for top-level macro methods reports missing block reports missing block reports unexpected named argument (2) reports unexpected named argument (2) reports wrong number of arguments, with optional parameters reports wrong number of arguments, with optional parameters reports unexpected block reports unexpected block reports unexpected named argument reports unexpected named argument reports wrong number of arguments reports wrong number of arguments Code gen: generic class type 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 consider abstract types for including types (#7200) doesn't consider abstract types for including types (#7200) invokes super in generic class (#2354) invokes super in generic class (#2354) doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for Tuple (#2839) 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 codegens virtual generic metaclass macro method call codegens virtual generic metaclass macro method call inherited instance var initialize from generic to concrete (#2128) inherited instance var initialize from generic to concrete (#2128) declares instance var with virtual T (#1675) declares instance var with virtual T (#1675) codegens inherited generic class instance var codegens inherited generic class instance var allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type inherited instance var initialize from generic to generic to concrete (#2128) inherited instance var initialize from generic to generic to concrete (#2128) instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) 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 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 use virtual + in type arguments for NamedTuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) 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) 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) runs generic instance var initializers in superclass's metaclass context (#4753) runs generic instance var initializers in superclass's metaclass context (#4753) doesn't use virtual + in type arguments (#2839) doesn't use virtual + in type arguments (#2839) 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 crash on generic type restriction with no subtypes (#7583) doesn't crash on generic type restriction with no subtypes (#7583) 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) Semantic: yield with scope uses method of enclosing scope uses method of enclosing scope yields virtual type (#2171) (2) yields virtual type (#2171) (2) it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method it uses self for instance method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses scope in global method uses instance variable of enclosing scope uses instance variable of enclosing scope yields with dispatch (#2171) (1) yields with dispatch (#2171) (1) uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method uses scope in instance method doesn't explode if specifying &block but never using it (#181) doesn't explode if specifying &block but never using it (#181) it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope uses method of with object uses method of with object generate right code when yielding struct as scope generate right code when yielding struct as scope Code gen: or codegens or with bool union as left node 2 codegens or with bool union as left node 2 codegens or with primitive type other than bool with union codegens or with primitive type other than bool with union codegens or with bool false and true codegens or with bool false and true codegens or with nilable as left node 2 codegens or with nilable as left node 2 codegens or with bool union as left node 4 codegens or with bool union as left node 4 codegens or with primitive type other than bool codegens or with primitive type other than bool codegens or with nil union as left node 2 codegens or with nil union as left node 2 codegens or with bool union as left node 1 codegens or with bool union as left node 1 codegens or with bool union as left node 3 codegens or with bool union as left node 3 codegens or with bool and int 2 codegens or with bool and int 2 codegens or with bool union as left node 3 codegens or with bool union as left node 3 codegens or with bool and int 1 codegens or with bool and int 1 codegens or with bool false and false codegens or with bool false and false codegens or with non-false union as left node codegens or with non-false union as left node codegens or with bool true and false codegens or with bool true and false codegens or with bool union as left node 2 codegens or with bool union as left node 2 codegens or with bool true and true codegens or with bool true and true codegens or with bool union as left node 1 codegens or with bool union as left node 1 codegens or with primitive type other than bool codegens or with primitive type other than bool codegens or with nil union as left node 1 codegens or with nil union as left node 1 codegens or with nilable as left node 1 codegens or with nilable as left node 1 Semantic: super 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) says correct error message when no overload matches in super call (#272) says correct error message when no overload matches in super call (#272) 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 named arguments, def has bare splat parameter (#8895) types super with named arguments, def has bare splat parameter (#8895) finds super initialize if not explicitly defined in superclass, 1 (#273) finds super initialize if not explicitly defined in superclass, 1 (#273) calls super in module method (3) (#556) calls super in module method (3) (#556) gives correct error when calling super and target is abstract method (#2675) gives correct error when calling super and target is abstract method (#2675) types super without arguments types super without arguments errors no superclass method errors no superclass method calls super in generic module method calls super in generic module method 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 errors if calling super on module method and not found errors if calling super on module method and not found types super with named arguments, def has bare splat parameter (2) (#8895) types super with named arguments, def has bare splat parameter (2) (#8895) finds super initialize if not explicitly defined in superclass, 2 (#273) finds super initialize if not explicitly defined in superclass, 2 (#273) errors no superclass method in top-level errors no superclass method in top-level invokes super inside macro (#6636) invokes super inside macro (#6636) 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) 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 calls super in module method (2) (#556) calls super in module method (2) (#556) 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) types super with forwarded arguments, def has double splat parameter (#8895) types super with forwarded arguments, def has double splat parameter (#8895) 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 errors on super outside method (#4481) errors on super outside method (#4481) types super without arguments and instance variable types super without arguments and instance variable types super with forwarded arguments, def has bare splat parameter (#8895) types super with forwarded arguments, def has bare splat parameter (#8895) errors no superclass method in top-level def errors no superclass method in top-level def Codegen: extern struct 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 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 declares extern struct with no constructor declares extern struct with no constructor 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 doesn't crash with proc with extern struct that's a closure doesn't crash with proc with extern struct that's a closure invokes proc with extern struct with sret invokes proc with extern struct with sret 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) codegens extern proc call twice (#4982) codegens extern proc call twice (#4982) declares extern union with no constructor declares extern union with no constructor 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 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 declares extern struct with no constructor, assigns var declares extern struct with no constructor, assigns var 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 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, sets and gets instance var declares extern struct, sets and gets instance var invokes proc with extern struct invokes proc with extern struct declares extern union, sets and gets instance var declares extern union, sets and gets instance var Code gen: 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 by invoking to_unsafe automatically converts by invoking to_unsafe builds struct setter with fun type (2) builds struct setter with fun type (2) codegens pointer malloc of struct codegens pointer malloc of struct yields struct via -> yields struct via -> passes struct to method (2) passes struct to method (2) codegens struct property setter codegens struct property setter codegens struct property default value codegens struct property default value 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) codegens struct property setter via pointer codegens struct property setter via pointer 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 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) codegens union inside struct codegens union inside struct allows using named arguments for new allows using named arguments for new automatically converts nil to pointer automatically converts nil to pointer automatically converts numeric union type in struct field assignment automatically converts numeric union type in struct field assignment codegens assign struct to union codegens assign struct to union codegens struct access with -> and then . codegens struct access with -> and then . codegens struct property setter via pointer codegens struct property setter via pointer builds struct setter with fun type (1) builds struct setter with fun type (1) can access member of uninitialized struct behind type (#8774) can access member of uninitialized struct behind type (#8774) codegens struct get inside struct codegens struct get inside struct codegens passing pointerof(struct) to fun codegens passing pointerof(struct) to fun codegens set struct value with constant codegens set struct value with constant Crystal::Doc::Generator .anchor_link generates the correct anchor link generates the correct anchor link Code gen: void allows passing void as argument to method allows passing void as argument to method codegens no return assignment codegens no return assignment 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 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 codegens unreachable code codegens unreachable code returns void from nil functions, doesn't crash when passing value returns void from nil functions, doesn't crash when passing value Lexer comments lexes correct number of spaces lexes correct number of spaces lexes with comments enabled lexes with comments enabled lexes without comments enabled lexes without comments enabled lexes with comments enabled (2) lexes with comments enabled (2) .parse_args DIR with path DIR with path DIR DIR DIR (absolute) DIR (absolute) DIR (relative to home) DIR (relative to home) NAME DIR NAME DIR DIR = . DIR = . Crystal::Doc::Type #instance_methods sorts operators first sorts operators first #node_to_html shows generic path with necessary colons shows generic path with necessary colons shows relative path shows relative path shows generic path with unnecessary colons shows generic path with unnecessary colons shows relative generic shows relative generic shows tuples shows tuples shows named tuples shows named tuples ASTNode has no ancestors ASTNode has no ancestors #class_methods sorts operators first sorts operators first doesn't show types for alias type doesn't show types for alias type ASTNode has no superclass ASTNode has no superclass #macros sorts operators first sorts operators first finds construct when searching class method (#8095) finds construct when searching class method (#8095) Crystal::Repl::Interpreter tuple extends sign when doing to_i32 extends sign when doing to_i32 interprets tuple self interprets tuple self interprets tuple literal of different types (2) interprets tuple literal of different types (2) does tuple indexer on union does tuple indexer on union interprets tuple range indexer (2) interprets tuple range indexer (2) unpacks tuple in block arguments unpacks tuple in block arguments discards tuple access discards tuple access interprets tuple metaclass indexer interprets tuple metaclass indexer interprets tuple literal and access by known index interprets tuple literal and access by known index interprets tuple literal of different types (1) interprets tuple literal of different types (1) interprets tuple range indexer interprets tuple range indexer interprets tuple metaclass range indexer interprets tuple metaclass range indexer discards tuple (#12383) discards tuple (#12383) Codegen: super codegens super that calls subclass method 4 codegens super that calls subclass method 4 doesn't invoke super twice in inherited generic types (#942) doesn't invoke super twice in inherited generic types (#942) codegens super that calls subclass method 2 codegens super that calls subclass method 2 does super in virtual type including module does super in virtual type including module calls super from virtual metaclass type (#2841) calls super from virtual metaclass type (#2841) codegens super inside closure codegens super inside closure codegens super without arguments and instance variable codegens super without arguments and instance variable codegens super without arguments but parent has arguments codegens super without arguments but parent has arguments calls super in module method (#556) calls super in module method (#556) calls super on an object (#10004) calls super on an object (#10004) codegens super without arguments codegens super without arguments build super on generic class (bug) build super on generic class (bug) codegens super inside closure forwarding args codegens super inside closure forwarding args calls super in generic module method calls super in generic module method codegens super that calls subclass method 5 codegens super that calls subclass method 5 codegens super that calls subclass method codegens super that calls subclass method codegens super that calls subclass method 6 codegens super that calls subclass method 6 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) codegens super that calls subclass method 3 codegens super that calls subclass method 3 Code gen: next codegens next conditionally codegens next conditionally codegens next codegens next codegens next with while inside block codegens next with while inside block codegens next with break (1) codegens next with break (1) codegens next with break (3) codegens next with break (3) codegens next conditionally with int type (2) codegens next conditionally with int type (2) codegens next with break (2) codegens next with break (2) codegens next without expressions codegens next without expressions semantic: case 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 nil type with nil literal checks exhaustiveness of nil type with nil literal checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal, with call 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 of 3 elements, all bool checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness of enum via question method checks exhaustiveness of enum via question method doesn't check exhaustiveness when using 'when' doesn't check exhaustiveness when using 'when' 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 of 2 elements, first is enum checks exhaustiveness for tuple literal of 2 elements, first is enum checks exhaustiveness of bool type (missing true) checks exhaustiveness of bool type (missing true) checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second 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 of enum via const checks exhaustiveness of enum via const 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 checks exhaustiveness of single type covers all types covers all types 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 of 2 elements, first is bool checks exhaustiveness for tuple literal of 2 elements, first is bool errors if casing against a constant errors if casing against a constant checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second 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 enum through method (all cases covered) checks exhaustiveness of enum through method (all cases covered) can't prove case is exhaustive for @[Flags] enum can't prove case is exhaustive for @[Flags] enum checks exhaustiveness of enum combined with another type checks exhaustiveness of enum combined with another type checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness, covers in base type covers checks exhaustiveness, covers in base type covers 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 of union type with virtual type checks exhaustiveness of union type with virtual type 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 of single type (T.class) checks exhaustiveness of single type (T.class) checks exhaustiveness of enum (all cases covered) checks exhaustiveness of enum (all cases covered) checks exhaustiveness of bool type (missing false) checks exhaustiveness of bool type (missing false) checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness of nilable type with nil literal checks exhaustiveness of nilable type with nil literal 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 checks exhaustiveness of single type (generic) checks exhaustiveness of single type (generic) checks exhaustiveness of union with bool checks exhaustiveness of union with bool checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of bool type with other types checks exhaustiveness of bool type with other types 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 bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position Code gen: proc call proc pointer call proc pointer codegens nilable proc type dispatch (2) codegens nilable proc type dispatch (2) casts from function pointer to proc casts from function pointer to proc 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) builds nilable proc type from fun builds nilable proc type from fun calls proc pointer with union (passed by value) arg calls proc pointer with union (passed by value) arg codegens proc in instance var initialize (#3016) codegens proc in instance var initialize (#3016) 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` codegens proc that references struct (bug) codegens proc that references struct (bug) call simple proc literal with return call simple proc literal with return returns proc as function pointer inside top-level fun (#14691) returns proc as function pointer inside top-level fun (#14691) executes proc pointer on primitive executes proc pointer on primitive 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 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 proc that returns a virtual type codegens proc that returns a virtual type assigns nil and proc to nilable proc type assigns nil and proc to nilable proc type gets proc pointer using virtual type (#1337) gets proc pointer using virtual type (#1337) 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 closures var on ->var.call (#8584) closures var on ->var.call (#8584) can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) doesn't crash on #2196 doesn't crash on #2196 builds proc type from fun builds proc type from fun 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 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 call proc literal with arguments call proc literal with arguments 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) 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) allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable 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) codegens nilable proc type (1) codegens nilable proc type (1) allows proc type of enum type with base type allows proc type of enum type with base type returns ProcPointer inside top-level fun (#14691) returns ProcPointer inside top-level fun (#14691) codegens proc of generic type codegens proc of generic 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) binds function pointer to associated call binds function pointer to associated call allows invoking proc literal with smaller type allows invoking proc literal with smaller type allows invoking a function with a subtype allows invoking a function with a subtype automatically casts proc that returns something to proc that returns void automatically casts proc that returns something to proc that returns void call proc pointer of instance method call proc pointer of instance method codegens captured block that returns tuple codegens captured block that returns tuple allows proc pointer where self is a class allows proc pointer where self is a class passes proc as &->expr to method that yields passes proc as &->expr to method that yields raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) raises if returning closure from top-level fun (#14691) 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 call simple proc literal call simple proc literal gets proc to lib fun (#504) gets proc to lib fun (#504) 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 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) takes pointerof function pointer takes pointerof function pointer allows redefining fun allows redefining fun does new on proc type does new on proc type 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 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 codegens nilable proc type dispatch (1) codegens nilable proc type dispatch (1) saves receiver value of proc pointer `->@ivar.foo` saves receiver value of proc pointer `->@ivar.foo` accesses T in macros as a TupleLiteral accesses T in macros as a TupleLiteral 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) codegens proc with union type that returns itself codegens proc with union type that returns itself call proc pointer with args call proc pointer with args saves receiver value of proc pointer `->var.foo` saves receiver value of proc pointer `->var.foo` codegens nilable proc type (2) codegens nilable proc type (2) allows invoking a function with a subtype when defined as block spec allows invoking a function with a subtype when defined as block spec 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) allows proc type of enum type allows proc type of enum type call proc literal with return type call proc literal with return type Crystal::Loader .parse parses library names parses library names parses file paths parses file paths parses directory paths parses directory paths parses static parses static prepends directory paths before default search paths prepends directory paths before default search paths dynlib #load_library? library name library name full path full path lookup in order lookup in order does not implicitly find dependencies does not implicitly find dependencies validate that lib handles are properly closed validate that lib handles are properly closed #load_file? finds function symbol finds function symbol does not find global symbols does not find global symbols .read_ld_conf basic basic with include with include .default_search_paths LD_LIBRARY_PATH LD_LIBRARY_PATH DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH Semantic: yield with scope uses instance variable of enclosing scope uses instance variable of enclosing scope finds macro finds macro passes #229 passes #229 errors if using instance variable at top level errors if using instance variable at top level invokes nested calls invokes nested calls uses method of enclosing scope uses method of enclosing scope infer type of block body with yield scope infer type of block body with yield scope infer type of empty block body infer type of empty block body infer type of block body with yield scope and arguments infer type of block body with yield scope and arguments mentions with yield scope and current scope in error mentions with yield scope and current scope in error infer type of block body infer type of block body Code gen: return codegens return followed by another expression codegens return followed by another expression returns in var assignment (#3364) returns in var assignment (#3364) return from function with nilable type return from function with nilable type codegens bug with return if true codegens bug with return if true codegens assign with if with two returns codegens assign with if with two returns codegens return inside if codegens return inside if return union return union return from function with union type return from function with union type forms a tuple from multiple return values forms a tuple from multiple return values return from function with nilable type 2 return from function with nilable type 2 returns empty from function returns empty from function doesn't crash when method returns nil and can be inlined doesn't crash when method returns nil and can be inlined codegens return codegens return flattens splats inside multiple return values flattens splats inside multiple return values Crystal::Init::InitProject has proper contents has proper contents correctly uses git config correctly uses git config Parser doc includes doc for macro includes doc for macro 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 constant assign includes doc for constant assign includes doc for class includes doc for class disables doc parsing inside defs disables doc parsing inside defs includes doc for abstract class includes doc for abstract class includes doc for module includes doc for module includes doc for abstract def includes doc for abstract def includes doc for annotation includes doc for annotation includes doc for fun def includes doc for fun def includes doc for def includes doc for def includes doc for enum def includes doc for enum def includes doc for private def includes doc for private def Semantic: type can access instance variables of original type can access instance variables of original type errors if original type doesn't support instance variables errors if original type doesn't support instance variables can call methods of parent type can call methods of parent type can call methods of original type can call methods of original type Semantic: primitives types nop types nop types @[Primitive] method types @[Primitive] method errors if @[Primitive] has no args errors if @[Primitive] has no args errors when comparing void (#225) errors when comparing void (#225) types 1 + 2 types 1 + 2 types nil types nil types a symbol types a symbol can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) types an int32 types an int32 looks up return type in correct scope (#13652) looks up return type in correct scope (#13652) types char ord types char ord types a float32 types a float32 allows @[Primitive] on method that has body allows @[Primitive] on method that has body Slice.literal with element type types empty literal types empty literal types primitive int literal types primitive int literal errors if element is out of range errors if element is out of range errors if element is not number literal errors if element is not number literal types primitive float literal types primitive float literal errors if element type is not primitive int or float errors if element type is not primitive int or float correctly types first hash from type vars (bug) correctly types first hash from type vars (bug) extends from Number and doesn't find + method extends from Number and doesn't find + method extends from Number and doesn't find >= method extends from Number and doesn't find >= method can invoke binary on primitive typedef (2) (#614) can invoke binary on primitive typedef (2) (#614) types a bool types a bool extends from Number and doesn't find to_i method extends from Number and doesn't find to_i method types a char types a char types a uint128 types a uint128 errors if @[Primitive] has non-symbol arg errors if @[Primitive] has non-symbol arg types a int64 types a int64 types a int128 types a int128 Reference.pre_initialize types with virtual reference type types with virtual reference type types with reference type types with reference type errors on uninstantiated generic type errors on uninstantiated generic type errors on abstract type errors on abstract type computes correct hash value type if it's a function literal (#320) computes correct hash value type if it's a function literal (#320) types va_arg primitive types va_arg primitive types a float64 types a float64 types an expression types an expression errors if using instance variable inside primitive type errors if using instance variable inside primitive type types pointer of int types pointer of int types a string types a string Crystal::Repl::Interpreter typeof interprets typeof metaclass type interprets typeof metaclass type interprets typeof virtual type interprets typeof virtual type interprets typeof instance type interprets typeof instance type Codegen: while endless conditional break with value endless conditional break with value codegens while with declared var 2 codegens while with declared var 2 endless break with value endless break with value doesn't crash on a = NoReturn doesn't crash on a = NoReturn break without value break without value break with value break with value break with value, condition fails break with value, condition fails doesn't crash on #2767 (3) doesn't crash on #2767 (3) codegens endless while codegens endless while skip block with next skip block with next codegens def with while codegens def with while doesn't crash on #2767 (2) doesn't crash on #2767 (2) doesn't crash on #2767 doesn't crash on #2767 doesn't crash on #2767 (4) doesn't crash on #2767 (4) doesn't crash on while true begin break rescue (#7786) doesn't crash on while true begin break rescue (#7786) conditional break with value conditional break with value codegens while with declared var 1 codegens while with declared var 1 codegens while with declared var 3 codegens while with declared var 3 conditional break without value conditional break without value codegens while with non-false condition codegens while with non-false condition codegens while with false codegens while with false Code gen: alias 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 (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) doesn't crash on cast to as recursive alias (#639) doesn't crash on cast to as recursive alias (#639) 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) 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 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) 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 codegens cast to alias that includes bool codegens cast to alias that includes bool Semantic: doc stores doc for struct when reopening stores doc for struct when reopening stores doc for alias stores doc for alias stores doc for abstract class stores doc for abstract class stores doc for nodes defined in macro call (2) stores doc for nodes defined in macro call (2) doc before annotation attached to macro attached to macro attached to macro call attached to macro call attached to macro call that produces multiple types attached to macro call that produces multiple types attached to alias attached to alias attached to def attached to def attached to module attached to module attached to constant attached to constant attached to struct/class attached to struct/class attached to enum attached to enum overwrites doc for struct when reopening overwrites doc for struct when reopening stores locations for auto-generated module stores locations for auto-generated module stores doc for enum member stores doc for enum member overwrites doc for enum when reopening overwrites doc for enum when reopening stores doc for enum stores doc for enum stores doc for def with annotation stores doc for def with annotation stores doc for nodes defined in macro call stores doc for nodes defined in macro call overwrites doc for def when redefining overwrites doc for def when redefining stores doc for struct stores doc for struct stores doc for class when reopening stores doc for class when reopening :ditto: :ditto: references last non-ditto doc :ditto: references last non-ditto doc amend previous doc amend previous doc stores doc for macro stores doc for macro amend previous doc (without empty line) amend previous doc (without empty line) stores doc for const stores doc for const stores doc for def stores doc for def stores doc for class stores doc for class stores location for implicit flag enum members stores location for implicit flag enum members stores doc for module stores doc for module stores doc for flags enum with base type stores doc for flags enum with base type stores doc for enum with @[Flags] stores doc for enum with @[Flags] stores doc for def stores doc for def overwrites doc for module when reopening overwrites doc for module when reopening stores doc for macro defined in macro call stores doc for macro defined in macro call overwrites doc for class when reopening overwrites doc for class when reopening stores doc for abstract def stores doc for abstract def stores doc for macro stores doc for macro overwrites doc for macro when redefining overwrites doc for macro when redefining attaches doc in double macro expansion (#8463) attaches doc in double macro expansion (#8463) stores doc for def with visibility stores doc for def with visibility stores doc for fun def stores doc for fun def stores doc for constant stores doc for constant stores doc for module when reopening stores doc for module when reopening attaches doc to annotation in macro expansion (#9628) attaches doc to annotation in macro expansion (#9628) stores doc for def with annotation stores doc for def with annotation stores doc for enum and doesn't mix with value stores doc for enum and doesn't mix with value stores doc for enum when reopening stores doc for enum when reopening Code gen: ssa codegens a var that is declared in a block (2) codegens a var that is declared in a block (2) codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (1) 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 codegens a var that is re-assigned in a block codegens declaration of var inside then when true codegens declaration of var inside then when true codegens a redefined var inside method with argument codegens a redefined var inside method with argument codegens ssa bug with if/else on var codegens ssa bug with if/else on var 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 ssa bug (1) codegens ssa bug (1) codegens ssa bug (2) codegens ssa bug (2) codegens a redefined var codegens a redefined var codegens a redefined var inside method codegens a redefined var inside method Codegen: until codegens until codegens until Code gen: if codegens bug #1729 codegens bug #1729 codegens if with nil codegens if with nil 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 generate truthy if branch if doesn't need value (bug) doesn't generate truthy if branch if doesn't need value (bug) doesn't crash with if !var using var in else doesn't crash with if !var using var in else codegens if with an else with true codegens if with an else with true codegens if of nilable type in else codegens if of nilable type in else codegens if with virtual codegens if with virtual codegen if with union type and then without type codegen if with union type and then without type codegens nested if with var (ssa bug) codegens nested if with var (ssa bug) codegens if value from then codegens if value from then doesn't crash no NoReturn var (true left cond) (#1823) doesn't crash no NoReturn var (true left cond) (#1823) codegens if with return in both branches codegens if with return in both branches codes if with two whiles codes if with two whiles codegens if of nilable type in else 3 codegens if of nilable type in else 3 codegens if with union codegens if with union codegens if with pointer 0x100000000 pointer codegens if with pointer 0x100000000 pointer codegen if inside if codegen if inside if codegens if of nilable type in then codegens if of nilable type in then codegens if of nilable type in then 2 codegens if of nilable type in then 2 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 #3104 codegens #3104 codegens if inside def without an else with true codegens if inside def without an else with true codegen if with nested if that returns codegen if with nested if that returns codegen if with union type and else without type codegen if with union type and else without type restricts with || always falsey restricts with || always falsey codegens if with return and no else codegens if with return and no else considers or truthy/falsey right considers or truthy/falsey right codegens if without an else with true codegens if without an else with true codegens if with int codegens if with int doesn't crash with if !is_a? using var in then doesn't crash with if !is_a? using var in then 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 codegens if with an else with false codegens if with an else with false Crystal::CrystalPath doesn't finds "./crystal_path_spec.cr" doesn't finds "./crystal_path_spec.cr" finds "./file_two.cr" finds "./file_two.cr" finds "test_files/another" finds "test_files/another" doesn't finds "../../src/file_three" doesn't finds "../../src/file_three" finds "./test_folder/file_three.cr" finds "./test_folder/file_three.cr" finds "./test_folder/*" finds "./test_folder/*" finds "../**" finds "../**" finds "test_files/file_four" finds "test_files/file_four" finds "test_files/**" finds "test_files/**" finds "other_test_files" finds "other_test_files" doesn't finds "test_files/missing_file.cr" doesn't finds "test_files/missing_file.cr" doesn't finds "test_folder/file_three.cr" doesn't finds "test_folder/file_three.cr" finds "test_files/file_one" finds "test_files/file_one" overrides path with environment variable overrides path with environment variable .expand_paths .expand_paths includes 'lib' by default includes 'lib' by default doesn't finds "./crystal_path_spec" doesn't finds "./crystal_path_spec" #each_file_expansion foo foo ./foo/bar ./foo/bar foo/bar foo/bar foo.cr/bar.cr foo.cr/bar.cr ./foo ./foo ./foo/bar/baz ./foo/bar/baz foo/bar/baz foo/bar/baz ./foo.cr ./foo.cr foo.cr/bar foo.cr/bar foo.cr foo.cr finds "test_files/*" finds "test_files/*" finds "test_files/file_one.cr" finds "test_files/file_one.cr" finds "test_files" finds "test_files" finds "foo.cr" finds "foo.cr" finds "test_files/file_three" finds "test_files/file_three" doesn't finds "test_folder/*" doesn't finds "test_folder/*" doesn't finds "build/reproducible-path/crystal-1.14.0+dfsg/spec/compiler/crystal_path/crystal_path_spec.cr" doesn't finds "build/reproducible-path/crystal-1.14.0+dfsg/spec/compiler/crystal_path/crystal_path_spec.cr" doesn't finds "file_two.cr" doesn't finds "file_two.cr" finds "test_files/yet_another" finds "test_files/yet_another" doesn't finds "../crystal_path/test_files/file_one" doesn't finds "../crystal_path/test_files/file_one" finds "../test_folder" finds "../test_folder" finds "crystal_path_spec" finds "crystal_path_spec" finds "test_files/file_one" finds "test_files/file_one" Semantic: def says can only defined def on types and self says can only defined def on types and self types a call with an int types a call with an int gives correct error for wrong number of arguments for program call inside type (2) (#1024) gives correct error for wrong number of arguments for program call inside type (2) (#1024) reports no overload matches reports no overload matches types call with global scope types call with global scope errors when default value is incompatible with type restriction errors when default value is incompatible with type restriction do not use body for the def type do not use body for the def type reports undefined method reports undefined method fixes bug #165 fixes bug #165 types simple recursion types simple recursion gives correct error for methods in Class (2) gives correct error for methods in Class (2) reports no overload matches 2 reports no overload matches 2 gives correct error for wrong number of arguments for program call inside type (#1024) gives correct error for wrong number of arguments for program call inside type (#1024) accesses free var of default argument (#1101) accesses free var of default argument (#1101) types putchar with Char types putchar with Char uses free variable with metaclass uses free variable with metaclass types getchar with Char types getchar with Char types a call with an argument types a call with an argument errors if trying to declare method on generic class instance errors if trying to declare method on generic class instance defines class method with self defines class method with self uses free variable as block return type uses free variable as block return type errors if return type doesn't match errors if return type doesn't match types a call with an argument uses a new scope types a call with an argument uses a new scope can't use self in toplevel method can't use self in toplevel method errors when calling two functions with nil type errors when calling two functions with nil type defines class method defines class method types a call with a double types a call with a double is ok if returns Int32? with explicit return is ok if returns Int32? with explicit return doesn't find type in namespace through free var doesn't find type in namespace through free var uses free variable with metaclass and default value uses free variable with metaclass and default value errors when default value is incompatible with non-type restriction errors when default value is incompatible with non-type restriction says compile-time type on error says compile-time type on error shows free variables if no overload matches shows free variables if no overload matches errors if return type doesn't match on instance method errors if return type doesn't match on instance method allows recursion with arg allows recursion with arg allows recursion allows recursion types call with union argument types call with union argument types mutual recursion types mutual recursion reports block given reports block given gives correct error for methods in Class gives correct error for methods in Class assigns def owner assigns def owner clones regex literal value (#2384) clones regex literal value (#2384) types a call with a float types a call with a float types simple recursion 2 types simple recursion 2 types a call with an argument types a call with an argument errors if return type doesn't match on class method errors if return type doesn't match on class method uses free variable uses free variable errors if declares def inside if errors if declares def inside if uses free variable and doesn't conflict with top-level type uses free variable and doesn't conflict with top-level type lookups methods in super modules lookups methods in super modules calls with default argument calls with default argument reports no block given reports no block given types empty body def types empty body def points error at name (#6937) points error at name (#6937) types mutual infinite recursion types mutual infinite recursion Crystal::Repl::Interpreter class vars interprets class var for virtual type interprets class var for virtual type reads class var initializer with union (#12633) reads class var initializer with union (#12633) does class var initializer with union (#12633) does class var initializer with union (#12633) interprets class var for virtual metaclass type interprets class var for virtual metaclass type finds self in class var initializer (#12439) finds self in class var initializer (#12439) interprets class var without initializer interprets class var without initializer interprets class var with initializer interprets class var with initializer Crystal::Repl::Interpreter extern does automatic C cast does automatic C cast 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 (union) interprets primitive struct_or_union_set and get (union) interprets primitive struct_or_union_set and get (struct) interprets primitive struct_or_union_set and get (struct) sets extern struct proc field sets extern struct proc field discards primitive struct_or_union_set and get (struct) discards primitive struct_or_union_set and get (struct) sets struct field through pointer sets struct field through pointer Semantic: method_missing does error in method_missing if wrong number of params does error in method_missing if wrong number of params finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' errors if method_missing expands to an incorrect method errors if method_missing expands to an incorrect method errors if method_missing expands to multiple methods errors if method_missing expands to multiple methods does error in method_missing macro with virtual type does error in method_missing macro with virtual type doesn't look up method_missing in with_yield_scope if call has a receiver (#12097) doesn't look up method_missing in with_yield_scope if call has a receiver (#12097) does method missing for generic type does method missing for generic type Normalize: until normalizes until normalizes until Codegen: is_a? codegens is_a? with nilable gives false because other type 2 codegens is_a? with nilable gives false because other type 2 transforms then if condition is always truthy transforms then if condition is always truthy codegens is_a? with virtual and module codegens is_a? with virtual and module codegens is_a? from virtual type to module codegens is_a? from virtual type to module works with inherited generic class against an instantiation works with inherited generic class against an instantiation codegens is_a? with union gives true codegens is_a? with union gives true virtual metaclass type is not virtual instance type (#12628) virtual metaclass type is not virtual instance type (#12628) says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) does is_a?/responds_to? twice (#1451) does is_a?/responds_to? twice (#1451) transforms else if condition is always falsey transforms else if condition is always falsey restricts type in else but lazily restricts type in else but lazily codegens untyped var (#4009) codegens untyped var (#4009) does is_a? with generic class metaclass does is_a? with generic class metaclass does is_a? with more strict virtual type does is_a? with more strict virtual type codegens is_a? with virtual and nil codegens is_a? with virtual and nil doesn't type merge (2) (#548) doesn't type merge (2) (#548) restricts virtual metaclass against virtual metaclass type restricts virtual metaclass against virtual metaclass type codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no type does is_a? for virtual generic instance type against generic does is_a? for virtual generic instance type against generic codegens is_a? from nilable reference union type to nil codegens is_a? from nilable reference union type to nil 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) codegens is_a? with union gives true codegens is_a? with union gives true codegens is_a? casts union to nilable codegens is_a? casts union to nilable codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no 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 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) restricts simple type with union restricts simple type with union does is_a? for union of module and type does is_a? for union of module and type passes is_a? with generic module type on virtual type (#10302) passes is_a? with generic module type on virtual type (#10302) codegens is_a? with virtual codegens is_a? with virtual codegens is_a? from nilable reference union type to type codegens is_a? from nilable reference union type to type resets truthy state after visiting nodes (bug) resets truthy state after visiting nodes (bug) does is_a?(generic type) for nested generic inheritance, through upcast (1) does is_a?(generic type) for nested generic inheritance, through upcast (1) 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? true for simple type codegens is_a? true for simple type 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 doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) evaluate method on filtered type nilable type not-nil evaluate method on filtered type nilable type not-nil evaluate method on filtered type evaluate method on filtered type restricts metaclass against virtual metaclass type restricts metaclass against virtual metaclass type gives false if generic type doesn't match exactly gives false if generic type doesn't match exactly 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) says false for value.is_a?(Class) says false for value.is_a?(Class) does is_a?(generic type) for nested generic inheritance (1) (#9660) does is_a?(generic type) for nested generic inheritance (1) (#9660) 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 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) 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) evaluates method on filtered union type 2 evaluates method on filtered union type 2 does is_a?(generic type) for nested generic inheritance (2) does is_a?(generic type) for nested generic inheritance (2) 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) restricts union with union restricts union with union codegens is_a? on right side of and codegens is_a? on right side of and evaluate method on filtered type nilable type nil evaluate method on filtered type nilable type nil codegens is_a? with union gives false codegens is_a? with union gives false codegens is_a? with union gives false codegens is_a? with union gives false codegens is_a? with nilable gives true codegens is_a? with nilable gives true says true for Class.is_a?(Class.class.class) (#4374) says true for Class.is_a?(Class.class.class) (#4374) 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) doesn't type merge (1) (#548) doesn't type merge (1) (#548) 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 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 does is_a?(generic type) for nested generic inheritance, through upcast (2) does is_a?(generic type) for nested generic inheritance, through upcast (2) doesn't work with inherited generic class against an instantiation (2) doesn't work with inherited generic class against an instantiation (2) 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) codegens is_a? false for simple type codegens is_a? false for simple type says true for Class.is_a?(Class.class) (#4374) says true for Class.is_a?(Class.class) (#4374) restricts union metaclass to metaclass (#12295) restricts union metaclass to metaclass (#12295) does is_a? with && and true condition does is_a? with && and true condition codegens is_a? casts union to nilable in method codegens is_a? casts union to nilable in method evaluates method on filtered union type evaluates method on filtered union type works with inherited generic class against an instantiation (3) works with inherited generic class against an instantiation (3) Crystal::Doc::Generator generates sitemap generates sitemap crystal repo inserts pseudo methods inserts pseudo methods #formatted_summary should generate the first sentence should generate the first sentence with no annotation, and no docs should generate nothing should generate nothing with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag 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 Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag should generate the first line should generate the first line with a Experimental annotation, and no docs should generate just the Experimental tag should generate just the Experimental tag #collect_constants returns empty array when constants are private returns empty array when constants are private #formatted_doc 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 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 a Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag with no annotation, and no docs should generate nothing should generate nothing with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag #must_include_toplevel? 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 returns true if program has method returns true if program has method returns false if program has nothing returns false if program has nothing 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 true if program has macro returns true if program has macro Code gen: macro keeps heredoc contents inside macro keeps heredoc contents inside macro expands def macro with var expands def macro with var checks if macro expansion returns (#821) checks if macro expansion returns (#821) expands macro expands macro forwards dir location forwards dir location says that enum doesn't have Flags annotation says that enum doesn't have Flags annotation 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 expands def macro with @type.name with virtual (2) expands def macro with @type.name with virtual (2) expands inline macro expands inline macro doesn't replace %s in string (#2178) doesn't replace %s in string (#2178) can access type variables that are not types can access type variables that are not types doesn't override local variable when using macro variable (2) doesn't override local variable when using macro variable (2) passes #826 passes #826 expands @type.name in virtual metaclass (1) expands @type.name in virtual metaclass (1) correctly resolves constant inside block in macro def correctly resolves constant inside block in macro def says that enum has Flags annotation says that enum has Flags annotation retains original yield expression (#2923) retains original yield expression (#2923) can use constants can use constants gets methods gets methods expands Path with resolve method expands Path with resolve method determines if method exists (true) determines if method exists (true) can access type variables can access type variables initializes instance var in macro initializes instance var in 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 keeps heredoc contents with interpolation inside macro forwards file location forwards file location expands def macro with @type.instance_vars with subclass expands def macro with @type.instance_vars with subclass types macro expansion bug (#1734) types macro expansion bug (#1734) stringifies type without virtual marker stringifies type without virtual marker errors if dynamic constant assignment after macro expansion errors if dynamic constant assignment after macro expansion 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 determines if method exists (false) determines if method exists (false) keeps line number with no block keeps line number with no block can access free variables can access free variables determines if overrides (true) determines if overrides (true) determines if variable has default value determines if variable has default value expands macro with default arg and splat (2) (#784) expands macro with default arg and splat (2) (#784) can refer to abstract (1) can refer to abstract (1) expands def macro expands def macro can refer to abstract (2) can refer to abstract (2) executes with named arguments for positional arg (2) executes with named arguments for positional arg (2) expands def macro with @type.name expands def macro with @type.name executes with named arguments for positional arg (3) executes with named arguments for positional arg (3) keeps line number with a block keeps line number with a block expands @type.name in virtual metaclass (2) expands @type.name in virtual metaclass (2) executes with named arguments executes with named arguments executes all_subclasses executes all_subclasses expands macro and resolves type correctly expands macro and resolves type correctly codegens macro with comment (bug) (#1396) codegens macro with comment (bug) (#1396) doesn't replace %q() (#2178) doesn't replace %q() (#2178) implicitly marks method as macro def when using @type implicitly marks method as macro def when using @type does block unpacking inside macro expression (#13707) does block unpacking inside macro expression (#13707) 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 def macro with @type.instance_vars expands def macro with @type.instance_vars expands @def in inline macro expands @def in inline macro runs macro with splat runs macro with splat executes subclasses executes subclasses 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 codegens macro def with default arg (similar to #496) codegens macro def with default arg (similar to #496) expands @def in macro expands @def in macro uses indexed macro variable with many keys uses indexed macro variable with many keys gets enum members with @type.constants gets enum members with @type.constants executes with named arguments for positional arg (1) executes with named arguments for positional arg (1) expands def macro with @type.name with virtual expands def macro with @type.name with virtual can access type variables of a generic type can access type variables of a generic type responds correctly to has_constant? with @top_level responds correctly to has_constant? with @top_level can refer to types can refer to types can iterate union types can iterate union types expands macro as class method expands macro as class method receives &block receives &block expands macro with default arg and splat (3) (#784) expands macro with default arg and splat (3) (#784) 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 can access type variables of a module can access type variables of a module determines if overrides, through another class (true) determines if overrides, through another class (true) surrounds {{yield}} with begin/end surrounds {{yield}} with begin/end determines if overrides, with macro method (false) determines if overrides, with macro method (false) forwards line number forwards line number uses invocation context uses invocation context gets enum members as constants gets enum members as constants expands macro with arguments expands macro with arguments expands def macro with instance var and method call (bug) expands def macro with instance var and method call (bug) expands macro that yields expands macro that yields 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) expands macro that invokes another macro expands macro that invokes another macro expands macro defined in class expands macro defined in class runs macro with arg and splat runs macro with arg and splat initializes class var in macro initializes class var in macro expands macro with escaped quotes (#895) expands macro with escaped quotes (#895) resolves alias in macro resolves alias in macro finds macro in class finds macro in class allows overriding macro definition when redefining base class allows overriding macro definition when redefining base class gets correct class name when there are classes in the middle gets correct class name when there are classes in the middle determines if overrides (false) determines if overrides (false) expands def macro with @type.instance_vars with virtual expands def macro with @type.instance_vars with virtual can refer to union (1) can refer to union (1) accepts compile-time flags accepts compile-time flags 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) 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) expands macro with default arg and splat (#784) expands macro with default arg and splat (#784) gets constant gets constant expands macro defined in base class expands macro defined in base class can access type variables of a tuple can access type variables of a tuple doesn't override local variable when using macro variable doesn't override local variable when using macro variable gets default value of instance variable gets default value of instance variable access to the program with @top_level access to the program with @top_level expands inline macro if (true) expands inline macro if (true) expands inline macro for expands inline macro for transforms hooks (bug) transforms hooks (bug) declares constant in macro (#838) declares constant in macro (#838) determines if overrides, through module (true) determines if overrides, through module (true) doesn't reuse macro nodes (bug) doesn't reuse macro nodes (bug) devirtualizes @type devirtualizes @type expands inline macro if (false) expands inline macro if (false) doesn't skip abstract classes when defining macro methods doesn't skip abstract classes when defining macro methods can refer to union (2) can refer to union (2) allows macro with default arguments allows macro with default arguments fixes empty types of macro expansions (#1379) fixes empty types of macro expansions (#1379) correctly recomputes call (bug) correctly recomputes call (bug) expands macro def with return (#1040) expands macro def with return (#1040) finds macro from virtual type finds macro from virtual type uses indexed macro variable uses indexed macro variable can refer to @type can refer to @type uses tuple T in method with free vars uses tuple T in method with free vars codegens macro def with splat (#496) codegens macro def with splat (#496) expands macro as class method and accesses @type expands macro as class method and accesses @type 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) Crystal::Playground::AgentInstrumentorTransformer instrument nested blocks unless in same line instrument nested blocks unless in same line instrument single statement var def instrument single statement var def instrument class defs instrument class defs instrument case statement instrument case statement instrument nested class defs instrument nested class defs instrument assignments in the rhs instrument assignments in the rhs instrument chained comparisons (#4663) instrument chained comparisons (#4663) instrument instance variable and class variables reads and writes instrument instance variable and class variables reads and writes instrument literals with expression names instrument literals with expression names instrument unary expressions instrument unary expressions instrument is_a? expressions instrument is_a? expressions instrument not expressions instrument not expressions instrument ivar with obj instrument ivar with obj do not instrument macro calls in class do not instrument macro calls in class instrument while statement instrument while statement instrument single statement def instrument single statement def instrument string interpolations instrument string interpolations do not instrument records class do not instrument records class instrument binary expressions instrument binary expressions do not instrument class initializing arguments do not instrument class initializing arguments instrument inside modules instrument inside modules instrument typeof instrument typeof instrument unless statement instrument unless statement allow visibility modifiers allow visibility modifiers instrument returns inside def instrument returns inside def instrument multi assignments in the rhs instrument multi assignments in the rhs instrument print with args instrument print with args instrument if statement instrument if statement instrument exceptions instrument exceptions do not instrument constants assignments do not instrument constants assignments do not instrument top level macro calls do not instrument top level macro calls instrument multi statement def instrument multi statement def instrument single variables expressions instrument single variables expressions instrument blocks and single yields instrument blocks and single yields instrument puts with args instrument puts with args instrument literals instrument literals instrument blocks and but non multi yields instrument blocks and but non multi yields do not instrument class/module declared macro do not instrument class/module declared macro Normalize: op assign normalizes var += normalizes var += normalizes exp[value] += normalizes exp[value] += normalizes var ||= normalizes var ||= normalizes var -= normalizes var -= normalizes var[0] += normalizes var[0] += normalizes var &&= normalizes var &&= normalizes exp[value] ||= normalizes exp[value] ||= normalizes exp.value += normalizes exp.value += normalizes var.value += normalizes var.value += normalizes var *= normalizes var *= normalizes @var[0] += normalizes @var[0] += normalizes exp[value] &&= normalizes exp[value] &&= normalizes exp[0] += normalizes exp[0] += normalizes exp.value ||= normalizes exp.value ||= normalizes @@var[0] += normalizes @@var[0] += normalizes @var.value += normalizes @var.value += normalizes var &+= normalizes var &+= normalizes var &*= normalizes var &*= normalizes @@var.value += normalizes @@var.value += normalizes var &-= normalizes var &-= normalizes exp.value &&= normalizes exp.value &&= Semantic: nil doesn't check return type for void doesn't check return type for void marks instance variables as nil when not in initialize marks instance variables as nil when not in initialize restricts type of 'if foo' on assign restricts type of 'if foo' on assign types nil types nil types empty types empty can call a fun with nil for pointer can call a fun with nil for pointer doesn't check return type for nil doesn't check return type for nil marks instance variables as nil but doesn't explode on macros marks instance variables as nil but doesn't explode on macros restricts type of 'if foo' restricts type of 'if foo' marks instance variables as nil when not in initialize 2 marks instance variables as nil when not in initialize 2 restricts type of 'while foo' restricts type of 'while foo' restricts type of 'while foo' on assign restricts type of 'while foo' on assign can call a fun with nil for typedef pointer can call a fun with nil for typedef pointer Lexer lexes ":**" lexes ":**" lexes "1.0f32" lexes "1.0f32" lexes "bar!" lexes "bar!" says syntax error on "-.42" says syntax error on "-.42" says syntax error on "-0o7777777777777777777777777777777777777777777777777" says syntax error on "-0o7777777777777777777777777777777777777777777777777" lexes "elsif?" lexes "elsif?" lexes "-=" lexes "-=" lexes "include" lexes "include" lexes "0x7fffffff" lexes "0x7fffffff" lexes symbol with backslash (#2187) lexes symbol with backslash (#2187) lexes "break!" lexes "break!" lexes "1E40" lexes "1E40" lexes "0b1010" lexes "0b1010" lexes "[]?" lexes "[]?" lexes "if" lexes "if" lexes "while?" lexes "while?" lexes "yield!" lexes "yield!" lexes "=" lexes "=" lexes utf-8 char lexes utf-8 char lexes "-1_i128" lexes "-1_i128" lexes "-1.0" lexes "-1.0" lexes "$foo123" lexes "$foo123" lexes "0x8000000000000000" lexes "0x8000000000000000" lexes "1i32" lexes "1i32" says syntax error on "4.0_u32" says syntax error on "4.0_u32" says syntax error on "0_12" says syntax error on "0_12" lexes != after identifier (#4815) lexes != after identifier (#4815) says syntax error on "0x1afafafafafafafafafafafu64" says syntax error on "0x1afafafafafafafafafafafu64" lexes "false!" lexes "false!" lexes "$foo" lexes "$foo" says syntax error on ".42" says syntax error on ".42" lexes "&+@foo" lexes "&+@foo" lexes "!~" lexes "!~" says syntax error on "0123" says syntax error on "0123" lexes ":foo?" lexes ":foo?" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" lexes "do!" lexes "do!" lexes "+@foo" lexes "+@foo" lexes "if!" lexes "if!" says syntax error on "4u12" says syntax error on "4u12" lexes "2e01" lexes "2e01" lexes "1i64hello" lexes "1i64hello" lexes "->" lexes "->" lexes "0x1_i64" lexes "0x1_i64" lexes "=~" lexes "=~" lexes "12341234🔮" lexes "12341234🔮" says syntax error on "1_.1" says syntax error on "1_.1" lexes "typeof" lexes "typeof" lexes "\n" lexes "\n" lexes "return" lexes "return" lexes "+0b1010" lexes "+0b1010" lexes "%}" lexes "%}" lexes "$1?" lexes "$1?" lexes ":<<" lexes ":<<" lexes "2147483648" lexes "2147483648" lexes "$?" lexes "$?" says syntax error on "4i65" says syntax error on "4i65" lexes "100_000" lexes "100_000" lexes "1" lexes "1" says syntax error on "\"\\x1z\"" says syntax error on "\"\\x1z\"" lexes "%=" lexes "%=" says syntax error on "$0?" says syntax error on "$0?" says syntax error on "0o200000_00000000_00000000" says syntax error on "0o200000_00000000_00000000" lexes "elsif!" lexes "elsif!" lexes "0o1000000000000000000000" lexes "0o1000000000000000000000" lexes "1_u128" lexes "1_u128" lexes "&" lexes "&" says syntax error on "2e+@foo" says syntax error on "2e+@foo" lexes "0x7fffffffffffffff" lexes "0x7fffffffffffffff" lexes "1i16" lexes "1i16" lexes "::" lexes "::" lexes "<<" lexes "<<" says syntax error on "4F32" says syntax error on "4F32" lexes "-9223372036854775808" lexes "-9223372036854775808" lexes char with unicode codepoint lexes char with unicode codepoint lexes "something" lexes "something" says syntax error on "118446744073709551616_u64" says syntax error on "118446744073709551616_u64" says syntax error on "2e8i8" says syntax error on "2e8i8" lexes "when" lexes "when" lexes "ensure" lexes "ensure" lexes "0b111111111111111111111111111111111111111111111111111111111111111" lexes "0b111111111111111111111111111111111111111111111111111111111111111" says syntax error on "18446744073709551616" says syntax error on "18446744073709551616" lexes "18446744073709551615" lexes "18446744073709551615" lexes "%" lexes "%" lexes "_" lexes "_" lexes ":!~" lexes ":!~" lexes ")" lexes ")" says syntax error on "32768_i16" says syntax error on "32768_i16" lexes char with unicode codepoint and curly with six hex digits lexes char with unicode codepoint and curly with six hex digits lexes "1e-23" lexes "1e-23" lexes "0x00ffffffffffffffff" lexes "0x00ffffffffffffffff" lexes "===" lexes "===" lexes "0b1111111111111111111111111111111_i32" lexes "0b1111111111111111111111111111111_i32" lexes ">>" lexes ">>" says syntax error on "'\\uFEDZ'" says syntax error on "'\\uFEDZ'" lexes ":|" lexes ":|" says syntax error on "0o40000000000i32" says syntax error on "0o40000000000i32" says syntax error on "-32769_i16" says syntax error on "-32769_i16" says syntax error on "'\\uDFFF'" says syntax error on "'\\uDFFF'" lexes "-0x80000001" lexes "-0x80000001" lexes "0_f32" lexes "0_f32" lexes ">>=" lexes ">>=" lexes "-0xFFFF" lexes "-0xFFFF" lexes "0b100000000000000000000000000000000" lexes "0b100000000000000000000000000000000" lexes "[" lexes "[" lexes "<" lexes "<" lexes "-" lexes "-" lexes regex after \r\n lexes regex after \r\n says syntax error on "0b1000000000000000000000000000000000000000000000000000000000000000i64" says syntax error on "0b1000000000000000000000000000000000000000000000000000000000000000i64" says syntax error on "4f22" says syntax error on "4f22" lexes "&**" lexes "&**" lexes "union" lexes "union" says syntax error on "2e+-2" says syntax error on "2e+-2" says syntax error on "0x1afafafafafafafafafafafi32" says syntax error on "0x1afafafafafafafafafafafi32" says syntax error on "/foo" says syntax error on "/foo" lexes ":foo=" lexes ":foo=" lexes "nil" lexes "nil" lexes "\110" lexes "\110" says syntax error on "2e+_2" says syntax error on "2e+_2" lexes dot and ident lexes dot and ident says syntax error on "4u65" says syntax error on "4u65" lexes "//" lexes "//" says syntax error on "0x100000000i32" says syntax error on "0x100000000i32" lexes ":\"foo\"" lexes ":\"foo\"" says syntax error on "0o73_f64" says syntax error on "0o73_f64" lexes "0x7fffffff_i32" lexes "0x7fffffff_i32" lexes "+1_i128" lexes "+1_i128" says syntax error on "0xFF_i8" says syntax error on "0xFF_i8" lexes __FILE__ lexes __FILE__ doesn't raise if slash r with slash n doesn't raise if slash r with slash n lexes "-@foo" lexes "-@foo" lexes "require" lexes "require" lexes "1e+23" lexes "1e+23" says syntax error on "0o1000000000000000000000i64" says syntax error on "0o1000000000000000000000i64" lexes "||" lexes "||" lexes "responds_to?" lexes "responds_to?" lexes "-1234" lexes "-1234" lexes "abstract" lexes "abstract" lexes "1_i8" lexes "1_i8" lexes "0.5" lexes "0.5" lexes ":&*" lexes ":&*" lexes '\0' lexes '\0' lexes "0o777777777777777777777" lexes "0o777777777777777777777" lexes "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111" lexes "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111" lexes "1f32" lexes "1f32" lexes ":&**" lexes ":&**" says syntax error on "$01" says syntax error on "$01" lexes utf-8 multibyte char lexes utf-8 multibyte char lexes "type" lexes "type" lexes "$10?" lexes "$10?" lexes '\b' lexes '\b' lexes "for" lexes "for" says syntax error on "2e+e" says syntax error on "2e+e" lexes "1_u64" lexes "1_u64" lexes "2_e2" lexes "2_e2" lexes "-0x80000000000000000000000000000000_i128" lexes "-0x80000000000000000000000000000000_i128" lexes "&&" lexes "&&" lexes "self" lexes "self" lexes ":[]" lexes ":[]" says syntax error on "-0x80000000000000000000000000000001" says syntax error on "-0x80000000000000000000000000000001" lexes "~" lexes "~" lexes "0" lexes "0" lexes "0o123" lexes "0o123" lexes ":==" lexes ":==" says syntax error on "01_i64" says syntax error on "01_i64" lexes "&+=" lexes "&+=" lexes "return?" lexes "return?" lexes "1u64" lexes "1u64" lexes ":>>" lexes ":>>" says syntax error on "4i22" says syntax error on "4i22" lexes "-0x8000000000000000_i64" lexes "-0x8000000000000000_i64" invalid byte sequence invalid byte sequence lexes space after char lexes space after char lexes "protected" lexes "protected" says syntax error on "-1_u128" says syntax error on "-1_u128" says syntax error on "4i33" says syntax error on "4i33" says syntax error on "/\\" says syntax error on "/\\" lexes "0b001111111111111111111111111111111111111111111111111111111111111111" lexes "0b001111111111111111111111111111111111111111111111111111111111111111" lexes "def" lexes "def" lexes "+0.5" lexes "+0.5" lexes "1_u32" lexes "1_u32" lexes "1f64" lexes "1f64" says syntax error on "4i12" says syntax error on "4i12" says syntax error on "0x1afafafafafafafafafafaf" says syntax error on "0x1afafafafafafafafafafaf" lexes "1u128" lexes "1u128" says syntax error on "-170141183460469231731687303715884105729" says syntax error on "-170141183460469231731687303715884105729" lexes "&-@foo" lexes "&-@foo" lexes comment and token lexes comment and token lexes "1_u16" lexes "1_u16" lexes "1_i32" lexes "1_i32" says syntax error on "-1_u64" says syntax error on "-1_u64" lexes symbol followed by != lexes symbol followed by != lexes "begin" lexes "begin" says syntax error on "9999999999999999999_i32" says syntax error on "9999999999999999999_i32" says syntax error on "-3_" says syntax error on "-3_" says syntax error on "-9223372036854775809_i64" says syntax error on "-9223372036854775809_i64" says syntax error on "-0u64" says syntax error on "-0u64" lexes "0i32" lexes "0i32" lexes ":+" lexes ":+" lexes "class" lexes "class" lexes '\a' lexes '\a' lexes "1_i128" lexes "1_i128" lexes "end?" lexes "end?" says syntax error on ":+1" says syntax error on ":+1" lexes "\n\n\n" lexes "\n\n\n" lexes "break?" lexes "break?" lexes "0xFFFF" lexes "0xFFFF" says syntax error on "4294967296_u32" says syntax error on "4294967296_u32" lexes symbol followed by == lexes symbol followed by == lexes ":~" lexes ":~" lexes ";" lexes ";" lexes "[]=" lexes "[]=" says syntax error on "1__1" says syntax error on "1__1" lexes "true?" lexes "true?" lexes "0_i32" lexes "0_i32" lexes ":===" lexes ":===" says syntax error on "-0x80000000000000000000000000000000" says syntax error on "-0x80000000000000000000000000000000" lexes "0b1_i64" lexes "0b1_i64" lexes "def!" lexes "def!" doesn't raise if many slash r with slash n doesn't raise if many slash r with slash n says syntax error on "'\\u{110000}'" says syntax error on "'\\u{110000}'" lexes symbol with quote lexes symbol with quote lexes "with_1" lexes "with_1" lexes "&-=" lexes "&-=" lexes ":かたな" lexes ":かたな" lexes space after keyword lexes space after keyword lexes "0o40000000000" lexes "0o40000000000" lexes "0🔮" lexes "0🔮" lexes "!" lexes "!" lexes "1e23" lexes "1e23" lexes "enum" lexes "enum" lexes "with" lexes "with" lexes "0o17777777777" lexes "0o17777777777" lexes "1234" lexes "1234" lexes "0xFFFFFFFF" lexes "0xFFFFFFFF" lexes "unless" lexes "unless" lexes "module" lexes "module" lexes "==" lexes "==" says syntax error on "65536_u16" says syntax error on "65536_u16" says syntax error on "0o1234567123456712345671234567" says syntax error on "0o1234567123456712345671234567" lexes "+1.0f32" lexes "+1.0f32" lexes "" lexes "" lexes "$10" lexes "$10" lexes "do" lexes "do" lexes "1i64" lexes "1i64" lexes "$_foo" lexes "$_foo" lexes "yield" lexes "yield" lexes float then zero (bug) lexes float then zero (bug) lexes '\t' lexes '\t' lexes "1hello" lexes "1hello" says syntax error on "\r1" says syntax error on "\r1" lexes "|" lexes "|" lexes ".." lexes ".." lexes "fun" lexes "fun" lexes "$~" lexes "$~" lexes "10000000000000000000_u64" lexes "10000000000000000000_u64" says syntax error on "-129_i8" says syntax error on "-129_i8" says syntax error on "0b_10" says syntax error on "0b_10" lexes "0o001777777777777777777777" lexes "0o001777777777777777777777" lexes "^=" lexes "^=" lexes "0x10000_0000_0000_0000_i128" lexes "0x10000_0000_0000_0000_i128" lexes "rescue" lexes "rescue" lexes "0o37777777777" lexes "0o37777777777" lexes "fooBar" lexes "fooBar" says syntax error on "0o1234567123456712345671234567u64" says syntax error on "0o1234567123456712345671234567u64" lexes "super" lexes "super" lexes "\10" lexes "\10" lexes "\4" lexes "\4" lexes "-9223372036854775809_i128" lexes "-9223372036854775809_i128" lexes " " lexes " " lexes "struct" lexes "struct" lexes "false?" lexes "false?" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000" lexes "is_a?" lexes "is_a?" says syntax error on "18446744073709551616_u64" says syntax error on "18446744073709551616_u64" lexes "nil?" lexes "nil?" lexes "+1_i64" lexes "+1_i64" lexes "while" lexes "while" says syntax error on "4i3" says syntax error on "4i3" lexes "+1234" lexes "+1234" lexes "+1" lexes "+1" lexes "-0b1010" lexes "-0b1010" lexes "\1" lexes "\1" lexes "+0xFFFF" lexes "+0xFFFF" lexes "1.2e+23_f64" lexes "1.2e+23_f64" lexes "0x3fffffffffffffff" lexes "0x3fffffffffffffff" lexes "lib" lexes "lib" lexes "@foo" lexes "@foo" lexes "nil!" lexes "nil!" lexes "0o123_i64" lexes "0o123_i64" lexes "out" lexes "out" lexes "1i128" lexes "1i128" lexes "\t" lexes "\t" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" lexes char with unicode codepoint and curly lexes char with unicode codepoint and curly says syntax error on "2e" says syntax error on "2e" lexes "*=" lexes "*=" lexes "select" lexes "select" says syntax error on "0b11_f32" says syntax error on "0b11_f32" lexes "14146167139683460000" lexes "14146167139683460000" lexes ":*" lexes ":*" lexes "^" lexes "^" lexes "340282366920938463463374607431768211455_u128" lexes "340282366920938463463374607431768211455_u128" lexes "/=" lexes "/=" lexes __DIR__ lexes __DIR__ lexes "0b11111111111111111111111111111111" lexes "0b11111111111111111111111111111111" lexes "..." lexes "..." says syntax error on "'\\1'" says syntax error on "'\\1'" lexes ":%" lexes ":%" says syntax error on "2ef32" says syntax error on "2ef32" says syntax error on "\"\\400\"" says syntax error on "\"\\400\"" lexes "$1" lexes "$1" lexes ">" lexes ">" lexes "0o1000000000000000000000" lexes "0o1000000000000000000000" lexes "yield?" lexes "yield?" lexes "&&=" lexes "&&=" lexes "1i64" lexes "1i64" lexes "(" lexes "(" lexes "&-" lexes "&-" lexes "+0" lexes "+0" lexes "]" lexes "]" lexes "2147483648.foo" lexes "2147483648.foo" lexes "=>" lexes "=>" lexes "begin!" lexes "begin!" says syntax error on ":\"foo" says syntax error on ":\"foo" says syntax error on "\"hi\\" says syntax error on "\"hi\\" says syntax error on "0b100000000000000000000000000000000i32" says syntax error on "0b100000000000000000000000000000000i32" says syntax error on "10e_10" says syntax error on "10e_10" lexes "1_234.567_890_f32" lexes "1_234.567_890_f32" lexes "+0o123" lexes "+0o123" says syntax error on "'\\uD800'" says syntax error on "'\\uD800'" lexes ":[]=" lexes ":[]=" lexes "while!" lexes "while!" lexes "def?" lexes "def?" lexes comment at the end lexes comment at the end says syntax error on "0xfffffffffffffffff_u64" says syntax error on "0xfffffffffffffffff_u64" lexes "of" lexes "of" lexes "foo?" lexes "foo?" says syntax error on "4u33" says syntax error on "4u33" lexes ":/" lexes ":/" lexes "9223372036854775808_i128" lexes "9223372036854775808_i128" lexes "}" lexes "}" lexes '\'' lexes '\'' lexes "0xffffffffffffffff" lexes "0xffffffffffffffff" lexes "sizeof" lexes "sizeof" lexes "$23?" lexes "$23?" lexes "0x80000001" lexes "0x80000001" lexes "case" lexes "case" lexes ":&+" lexes ":&+" lexes "with_underscores" lexes "with_underscores" lexes "unless!" lexes "unless!" lexes "+1.0" lexes "+1.0" lexes ":" lexes ":" says syntax error on "'\\u{}'" says syntax error on "'\\u{}'" lexes "?" lexes "?" lexes "do?" lexes "do?" lexes ":<" lexes ":<" lexes "**" lexes "**" says syntax error on "0o7777777777777777777777777777777777777777777777777" says syntax error on "0o7777777777777777777777777777777777777777777777777" says syntax error on "9223372036854775808_i64" says syntax error on "9223372036854775808_i64" says syntax error on "128_i8" says syntax error on "128_i8" lexes "9223372036854775808" lexes "9223372036854775808" lexes "return!" lexes "return!" lexes "\x12" lexes "\x12" lexes "&=" lexes "&=" lexes not instance var lexes not instance var lexes "1u32" lexes "1u32" lexes "||=" lexes "||=" lexes "1_i16" lexes "1_i16" says syntax error on "0o200_i8" says syntax error on "0o200_i8" lexes "|" lexes "|" lexes "-1.0f32" lexes "-1.0f32" says syntax error on "4u22" says syntax error on "4u22" lexes "-2147483649" lexes "-2147483649" lexes "0xffffffff" lexes "0xffffffff" says syntax error on "-999999999999999999999999999999999999999" says syntax error on "-999999999999999999999999999999999999999" lexes "if?" lexes "if?" lexes "-0xFFFFFFFF" lexes "-0xFFFFFFFF" lexes "0f32" lexes "0f32" says syntax error on "256_u8" says syntax error on "256_u8" says syntax error on "-1_u16" says syntax error on "-1_u16" lexes "0o17777777777_i32" lexes "0o17777777777_i32" 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" says syntax error on "0x10000_0000_0000_0000" says syntax error on "0x10000_0000_0000_0000" says syntax error on "4f33" says syntax error on "4f33" lexes "0xffff_ffff_ffff_ffff" lexes "0xffff_ffff_ffff_ffff" lexes "1_i64" lexes "1_i64" lexes '\v' lexes '\v' lexes "@[" lexes "@[" lexes "-0o123" lexes "-0o123" lexes "end" lexes "end" lexes "1e+23_f32" lexes "1e+23_f32" lexes "0xFFFF_u64" lexes "0xFFFF_u64" lexes "1e23f64" lexes "1e23f64" lexes "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128" lexes "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128" lexes "alias" lexes "alias" lexes "1.0f64" lexes "1.0f64" says syntax error on "2147483648_i32" says syntax error on "2147483648_i32" lexes "private" lexes "private" lexes "{%" lexes "{%" lexes symbol followed by === lexes symbol followed by === lexes '\\' lexes '\\' lexes "1_i64" lexes "1_i64" lexes "ident" lexes "ident" says syntax error on "'\\" says syntax error on "'\\" lexes "0b0_1" lexes "0b0_1" lexes "Foo" lexes "Foo" says syntax error on "'\\u{DFFF}'" says syntax error on "'\\u{DFFF}'" lexes ":<=>" lexes ":<=>" says syntax error on "0o200000_00000000_00000000_u64" says syntax error on "0o200000_00000000_00000000_u64" lexes char with unicode codepoint and curly with zeros lexes char with unicode codepoint and curly with zeros lexes "else!" lexes "else!" lexes "0o177777_77777777_77777777" lexes "0o177777_77777777_77777777" says syntax error on "-1_u32" says syntax error on "-1_u32" lexes "{{" lexes "{{" lexes "then" lexes "then" lexes ":=~" lexes ":=~" says syntax error on "0x8000000000000000i64" says syntax error on "0x8000000000000000i64" lexes "1.2e+23" lexes "1.2e+23" lexes "&*" lexes "&*" lexes "**=" lexes "**=" lexes "/" lexes "/" lexes "{" lexes "{" says syntax error on "2e+f32" says syntax error on "2e+f32" lexes "unless?" lexes "unless?" lexes "1.foo" lexes "1.foo" lexes "1.0f32hello" lexes "1.0f32hello" lexes "0e40" lexes "0e40" says syntax error on "-1_u8" says syntax error on "-1_u8" lexes "annotation" lexes "annotation" lexes "&*=" lexes "&*=" says syntax error on "0b🔮" says syntax error on "0b🔮" lexes "18446744073709551616_u128" lexes "18446744073709551616_u128" lexes '\r' lexes '\r' lexes "1_u8" lexes "1_u8" says syntax error on "-11111111111111111111" says syntax error on "-11111111111111111111" lexes "<=>" lexes "<=>" says syntax error on "18446744073709551616_i32" says syntax error on "18446744073709551616_i32" lexes "asm" lexes "asm" lexes "pointerof" lexes "pointerof" says syntax error on "340282366920938463463374607431768211456" says syntax error on "340282366920938463463374607431768211456" lexes '\f' lexes '\f' lexes "<<=" lexes "<<=" lexes ":>" lexes ":>" lexes ":&" lexes ":&" lexes "1_234.567_890" lexes "1_234.567_890" says syntax error on "'" says syntax error on "'" says syntax error on "-0e_12" says syntax error on "-0e_12" lexes "0x100000000" lexes "0x100000000" lexes "macro" lexes "macro" lexes "\8" lexes "\8" lexes ":<=" lexes ":<=" says syntax error on "4F64" says syntax error on "4F64" lexes "1.0" lexes "1.0" lexes ">=" lexes ">=" lexes __LINE__ lexes __LINE__ lexes ":!=" lexes ":!=" lexes "$FOO" lexes "$FOO" lexes regex after \n lexes regex after \n lexes "else" lexes "else" lexes "-0.5" lexes "-0.5" lexes "*" lexes "*" lexes "instance_sizeof" lexes "instance_sizeof" lexes "verbatim" lexes "verbatim" lexes "as?" lexes "as?" lexes "❨╯°□°❩╯︵┻━┻" lexes "❨╯°□°❩╯︵┻━┻" lexes "&+" lexes "&+" lexes ":foo!" lexes ":foo!" lexes "-0" lexes "-0" says syntax error on "-9223372036854775809" says syntax error on "-9223372036854775809" lexes "118446744073709551616_u128" lexes "118446744073709551616_u128" lexes "0xabcdef" lexes "0xabcdef" lexes "170141183460469231731687303715884105728_u128" lexes "170141183460469231731687303715884105728_u128" lexes "next!" lexes "next!" lexes "//=" lexes "//=" says syntax error on "'\\u{D800}'" says syntax error on "'\\u{D800}'" says syntax error on "-9999999999999999999" says syntax error on "-9999999999999999999" lexes "begin?" lexes "begin?" lexes "+=" lexes "+=" lexes "," lexes "," lexes "in" lexes "in" lexes ":foo" lexes ":foo" lexes "9223372036854775807" lexes "9223372036854775807" says syntax error on "-2147483649_i32" says syntax error on "-2147483649_i32" lexes "elsif" lexes "elsif" lexes "class?" lexes "class?" lexes "0i8" lexes "0i8" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000u64" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000u64" lexes '\n' lexes '\n' lexes "170141183460469231731687303715884105727_i128" lexes "170141183460469231731687303715884105727_i128" lexes 'a' lexes 'a' lexes "next" lexes "next" lexes "1.0f32" lexes "1.0f32" lexes "0o700000000000000000000" lexes "0o700000000000000000000" lexes "-1_i64" lexes "-1_i64" lexes "!=" lexes "!=" lexes "next?" lexes "next?" lexes "end!" lexes "end!" lexes "<=" lexes "<=" lexes "until" lexes "until" lexes "1_000" lexes "1_000" lexes "\xFF" lexes "\xFF" lexes "0x3🔮" lexes "0x3🔮" lexes "1u8" lexes "1u8" 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 "uninitialized" lexes "uninitialized" lexes "[]" lexes "[]" lexes "1u16" lexes "1u16" says syntax error on "-99999999999999999999" says syntax error on "-99999999999999999999" lexes "://" lexes "://" lexes "break" lexes "break" lexes ":^" lexes ":^" says syntax error on "2e+" says syntax error on "2e+" lexes "+" lexes "+" lexes "-1" lexes "-1" lexes "@@foo" lexes "@@foo" lexes "!@foo" lexes "!@foo" says syntax error on "4f65" says syntax error on "4f65" says syntax error on "0b10000000_i8" says syntax error on "0b10000000_i8" lexes ":-" lexes ":-" lexes "else?" lexes "else?" lexes "as" lexes "as" lexes "1i128hello" lexes "1i128hello" lexes "0b1000000000000000000000000000000000000000000000000000000000000000" lexes "0b1000000000000000000000000000000000000000000000000000000000000000" lexes '\0' lexes '\0' lexes heredoc start lexes heredoc start lexes "-0.0f32" lexes "-0.0f32" lexes "0b1111111111111111111111111111111" lexes "0b1111111111111111111111111111111" lexes "offsetof" lexes "offsetof" lexes ":&-" lexes ":&-" lexes "|=" lexes "|=" says syntax error on "0o12345671234567_12345671234567_i8" says syntax error on "0o12345671234567_12345671234567_i8" lexes "." lexes "." says syntax error on "-0_u64" says syntax error on "-0_u64" lexes "1.0hello" lexes "1.0hello" says syntax error on "118446744073709551616" says syntax error on "118446744073709551616" says syntax error on "0x10000_0000_0000_0000_u64" says syntax error on "0x10000_0000_0000_0000_u64" says syntax error on "00" says syntax error on "00" lexes "true" lexes "true" lexes ":>=" lexes ":>=" says syntax error on "\"\\xz\"" says syntax error on "\"\\xz\"" lexes "false" lexes "false" lexes "1.2e+23_f32" lexes "1.2e+23_f32" lexes "true!" lexes "true!" lexes ":[]?" lexes ":[]?" says syntax error on "0F32" says syntax error on "0F32" lexes "1i8" lexes "1i8" lexes ":!" lexes ":!" says syntax error on "4u3" says syntax error on "4u3" lexes "class!" lexes "class!" lexes "extend" lexes "extend" Semantic: nilable cast doesn't introduce type filter for nilable cast object (#12661) doesn't introduce type filter for nilable cast object (#12661) types as? with NoReturn types as? with NoReturn types as? with union types as? with union does upcast does upcast types as? types as? types as? with nil types as? with nil doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) casts to module casts to module types to_s of does for type contained in generic class does for type contained in generic class 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 nilable reference type nilable reference type array of simple types array of simple types union of simple types union of simple types named tuple named tuple non-instantiated array non-instantiated array 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 nilable value type nilable value type Semantic: warnings deprecated macros detects top-level deprecated macros detects top-level deprecated macros informs warnings once per call site location (a) informs warnings once per call site location (a) deprecation reason is optional deprecation reason is optional errors if invalid argument type errors if invalid argument type errors if invalid named argument errors if invalid named argument errors if too many arguments errors if too many arguments detects deprecated class macros detects deprecated class macros detects deprecated module macros detects deprecated module macros detects deprecated macros with named arguments detects deprecated macros with named arguments informs warnings once per call site location (b) informs warnings once per call site location (b) detects deprecated generic class macros detects deprecated generic class macros ignore deprecation excluded locations ignore deprecation excluded locations deprecated annotations detects deprecated annotations detects deprecated annotations detects deprecated namespaced annotations detects deprecated namespaced annotations exposes syntax warnings exposes syntax warnings exposes syntax warnings after macro interpolation exposes syntax warnings after macro interpolation deprecated constants detects deprecated constants inside macros detects deprecated constants inside macros detects deprecated constants in type declarations (2) detects deprecated constants in type declarations (2) detects deprecated constants detects deprecated constants detects deprecated constants in type declarations (1) detects deprecated constants in type declarations (1) detects deprecated constants in type declarations (3) detects deprecated constants in type declarations (3) deprecated methods detects deprecated generic class methods detects deprecated generic class methods errors if too many arguments errors if too many arguments informs warnings once per target type informs warnings once per target type detects deprecated instance methods detects deprecated instance methods detects deprecated generic instance methods detects deprecated generic instance methods detects deprecated initialize detects deprecated initialize ignore deprecation excluded locations ignore deprecation excluded locations ignores nested calls to deprecated methods ignores nested calls to deprecated methods informs warnings once per yield informs warnings once per yield detects deprecated class methods detects deprecated class methods errors if invalid named arguments errors if invalid named arguments deprecation reason is optional deprecation reason is optional detects top-level deprecated methods detects top-level deprecated methods informs warnings once per call site location (a) informs warnings once per call site location (a) detects deprecated initialize with named arguments detects deprecated initialize with named arguments detects deprecated module methods detects deprecated module methods errors if invalid argument type errors if invalid argument type informs warnings once per call site location (b) informs warnings once per call site location (b) detects deprecated methods with named arguments detects deprecated methods with named arguments abstract def positional parameter name mismatch detects multiple mismatches detects multiple mismatches doesn't warn if current type is abstract (#12266) doesn't warn if current type is abstract (#12266) respects external names of positional parameters (1) respects external names of positional parameters (1) continues warning if implementation with matching parameters is not found (#12150) single splat single splat double splat double splat not a full implementation not a full implementation doesn't compare single splats doesn't compare single splats doesn't warn if external parameter name matches (1) doesn't warn if external parameter name matches (1) stops warning after implementation with matching parameters is found (#12150) exact match exact match contravariant restrictions contravariant restrictions reordered named parameters reordered named parameters different single splats different single splats informs warnings once per matching overload (1) informs warnings once per matching overload (1) doesn't compare positional parameters to single splat doesn't compare positional parameters to single splat detects mismatch within many parameters detects mismatch within many parameters informs warnings once per matching overload (2) informs warnings once per matching overload (2) detects mismatch with single parameter detects mismatch with single parameter doesn't warn if external parameter name matches (2) doesn't warn if external parameter name matches (2) doesn't warn if current type is a module (#12266) doesn't warn if current type is a module (#12266) respects external names of positional parameters (2) respects external names of positional parameters (2) Crystal::Repl::Interpreter multidispatch casts multidispatch argument to the def's arg type casts multidispatch argument to the def's arg type doesn't compile block if it's not used (no yield) doesn't compile block if it's not used (no yield) does multidispatch with captured block (#12217) does multidispatch with captured block (#12217) does dispatch on receiver type and argument type, multiple times does dispatch on receiver type and argument type, multiple times 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 with struct receiver, and modifies it does dispatch on one argument with struct receiver, and modifies it downcasts self from union to struct (pass pointer to self) downcasts self from union to struct (pass pointer to self) does dispatch on virtual type does dispatch on virtual type does dispatch on receiver type does dispatch on receiver type does multidispatch with mandatory named arguments does multidispatch with mandatory named arguments does dispatch on one argument with block does dispatch on one argument with block initialize multidispatch initialize multidispatch does dispatch on receiver type and argument type does dispatch on receiver type and argument 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 passes self as pointer when doing multidispatch (2) passes self as pointer when doing multidispatch (2) does multidispatch on virtual metaclass type (2) does multidispatch on virtual metaclass type (2) does dispatch on one argument inside module with explicit receiver does dispatch on one argument inside module with explicit receiver Crystal::Repl::Interpreter bugs doesn't incorrectly consider a non-closure as closure doesn't incorrectly consider a non-closure as closure breaks from current block, not from outer block breaks from current block, not from outer block does leading zeros does leading zeros does multidispatch on virtual struct does multidispatch on virtual struct doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method (FileNode) does multidispatch on virtual struct union nil does multidispatch on virtual struct union nil 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 correctly puts virtual metaclass type in union correctly puts virtual metaclass type in union doesn't pass self to top-level method doesn't pass self to top-level method Crystal::Doc::MarkdDocRenderer expand_code_links finds operator method with unspecified args finds operator method with unspecified args doesn't find type not at word boundary doesn't find type not at word boundary finds constant finds constant doesn't find wrong absolute type doesn't find wrong absolute type finds types from base finds types from base finds method with question mark finds method with question mark finds method with exclamation mark finds method with exclamation mark finds method with args even with empty brackets finds method with args even with empty brackets doesn't find method with wrong number of args doesn't find method with wrong number of args doesn't find parents' methods doesn't find parents' methods finds sibling methods finds sibling methods finds method with unspecified args finds method with unspecified args doesn't match with different separator doesn't match with different separator doesn't find substrings for methods doesn't find substrings for methods finds nested type finds nested type finds types from nested finds types from nested finds method of an absolute type finds method of an absolute type finds multiple kinds of things finds multiple kinds of things doesn't find wrong kind of sibling methods doesn't find wrong kind of sibling methods finds methods of a type finds methods of a type finds sibling methods finds sibling methods finds sibling methods with self receiver finds sibling methods with self receiver doesn't find method with wrong number of args doesn't find method with wrong number of args finds multiple methods with brackets finds multiple methods with brackets does not break when referencing lib type (#9928) does not break when referencing lib type (#9928) finds method with args finds method with args matches methods on single-character class names matches methods on single-character class names doesn't find parents' methods doesn't find parents' methods finds method with zero args finds method with zero args doesn't find sibling methods with fake receiver doesn't find sibling methods with fake receiver doesn't find sibling methods of wrong type doesn't find sibling methods of wrong type doesn't find wrong kind of methods doesn't find wrong kind of methods finds absolute type finds absolute type doesn't spuriously match range literals doesn't spuriously match range literals finds operator method finds operator method renders code spans renders "`