Thu Dec 26 11:51:03 UTC 2024 I: starting to build crystal/trixie/amd64 on jenkins on '2024-12-26 11:50' Thu Dec 26 11:51:03 UTC 2024 I: The jenkins build log is/was available at https://jenkins.debian.net/userContent/reproducible/debian/build_service/amd64_24/44037/console.log Thu Dec 26 11:51:03 UTC 2024 I: Downloading source for trixie/crystal=1.14.0+dfsg-1 --2024-12-26 11:51:03-- http://deb.debian.org/debian/pool/main/c/crystal/crystal_1.14.0%2bdfsg-1.dsc Connecting to 46.16.76.132:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 2167 (2.1K) [text/prs.lines.tag] Saving to: ‘crystal_1.14.0+dfsg-1.dsc’ 0K .. 100% 210M=0s 2024-12-26 11:51:03 (210 MB/s) - ‘crystal_1.14.0+dfsg-1.dsc’ saved [2167/2167] Thu Dec 26 11:51:03 UTC 2024 I: crystal_1.14.0+dfsg-1.dsc -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Format: 3.0 (quilt) Source: crystal Binary: crystal, crystal-doc, crystal-samples Architecture: amd64 all Version: 1.14.0+dfsg-1 Maintainer: David Suárez Homepage: https://crystal-lang.org/ Standards-Version: 4.7.0 Vcs-Browser: https://salsa.debian.org/deiv/crystal Vcs-Git: https://salsa.debian.org/deiv/crystal.git Build-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) Package-List: crystal deb devel optional arch=amd64 crystal-doc deb doc optional arch=all crystal-samples deb devel optional arch=all Checksums-Sha1: a88de1137d1436a467e431031777893c0a13509a 2489948 crystal_1.14.0+dfsg.orig.tar.xz e763b75d2b39bf858010eebd7eeb32aa88f7969f 66760 crystal_1.14.0+dfsg-1.debian.tar.xz Checksums-Sha256: 4cf851b2ea0a6ba4049a4c82960cec132a113df3e457a1cca24a98afa07faacd 2489948 crystal_1.14.0+dfsg.orig.tar.xz b3c2e7ed04eb1f9c6d2d23ff26144a0672b4789f4468d6c896bf97adc79a3eef 66760 crystal_1.14.0+dfsg-1.debian.tar.xz Files: e528e2d26955ca2846b33c1176f092e1 2489948 crystal_1.14.0+dfsg.orig.tar.xz 55726201ef8320cfe99d90ab3139c983 66760 crystal_1.14.0+dfsg-1.debian.tar.xz -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEExFAZYDOyRoLv5EydfLboPYYFQjoFAmdlnVoACgkQfLboPYYF Qjqb2g/+LWP9//pBozhNE5X9NWVzK46YA8AJdiM9BOBwxaVLulR7VnelByAkgOeC hfAcbd05vxiFukgrvtsJpLgLA6TqEOWrHlshDt0qqKytze+7LRXIcn4QHyCmjxoK nDUoDhcLmecLG8omnUSPUECojRHb1pOIy6Zw3HnQzKAMinW7/ikSRIt+eEmBytEr BM6dcS8OgT2cwVQ4m+keqvwN/2O3lATccq5uvbwg9PwV+CjDj3Ue7zRZyxzuktsw dPGDSorcdgR12yUL7inVRPmILLkCTaiIY/hxo/9DwZE5DPe3teWGTMolKEj7LvZj 7vw1tDSU61gvHlcKLfLKNpGr6HK9O8nqvUGfsu1HE1fgktQ1gnM3EGCOZpXqnNSQ Fbe6finedCQhEO1HnQZjDqz+lH0RwI9mufa4IOUnM88G/F6CGKLb+yQe77bHF8Qk lCgVwNz+HO44cKruTZsziGJ2qifpOUZC8sFlv9X3M04/aVlcBYrU5vPJt7QkQRBJ biglNXNPdVt131LC6HAnYon3P30xmPP1anrWAt5kZC7TUElOYjMiUyiDp/wiqWFU YWNui4g+CvQmIyhq6k9zqouZ7zUWbcGIybtiGdhg2rcAKIdH5Rr/4V+Ffg9Ou0cg ldy4nNJ1gF06MeVrkX2KHGkbmWvDCLyAmCqBlBv4/E8ItJAjaJ0= =Tmo1 -----END PGP SIGNATURE----- Thu Dec 26 11:51:03 UTC 2024 I: Checking whether the package is not for us Thu Dec 26 11:51:03 UTC 2024 I: Starting 1st build on remote node ionos15-amd64.debian.net. Thu Dec 26 11:51:03 UTC 2024 I: Preparing to do remote build '1' on ionos15-amd64.debian.net. Thu Dec 26 13:56:55 UTC 2024 I: Deleting $TMPDIR on ionos15-amd64.debian.net. I: pbuilder: network access will be disabled during build I: Current time: Wed Jan 28 06:14:05 -12 2026 I: pbuilder-time-stamp: 1769624045 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 gpgv: Signature made Fri Dec 20 16:37:46 2024 gpgv: using RSA key C450196033B24682EFE44C9D7CB6E83D8605423A gpgv: Can't check signature: No public key dpkg-source: warning: cannot verify inline signature for ./crystal_1.14.0+dfsg-1.dsc: no acceptable signature found 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/3887662/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='d450d16e59204f9da79168563ecae593' 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='3887662' 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.BytRbhWB/pbuilderrc_esLW --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.BytRbhWB/b1 --logfile b1/build.log crystal_1.14.0+dfsg-1.dsc' SUDO_GID='111' SUDO_UID='106' SUDO_USER='jenkins' TERM='unknown' TZ='/usr/share/zoneinfo/Etc/GMT+12' USER='root' _='/usr/bin/systemd-run' http_proxy='http://213.165.73.152:3128' I: uname -a Linux ionos15-amd64 6.11.10+bpo-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.11.10-1~bpo12+1 (2024-12-19) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Nov 22 2024 /bin -> usr/bin I: user script /srv/workspace/pbuilder/3887662/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 ... 19966 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} icu-devtools{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} libfile-stripnondeterminism-perl{a} libgc-dev{a} libgc1{a} libgmp-dev{a} libgmpxx4ldbl{a} libgssapi-krb5-2{a} libicu-dev{a} libicu72{a} libjs-codemirror{a} libjs-jquery{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libldap-2.5-0{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} libnsl2{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.12-minimal{a} libpython3.12-stdlib{a} libreadline8t64{a} librtmp1{a} libsasl2-2{a} libsasl2-modules-db{a} libssh2-1t64{a} libssl-dev{a} libtirpc-common{a} libtirpc3t64{a} libtool{a} libuchardet0{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-autocommand{a} python3-inflect{a} python3-jaraco.context{a} python3-jaraco.functools{a} python3-minimal{a} python3-more-itertools{a} python3-pkg-resources{a} python3-pygments{a} python3-typeguard{a} python3-typing-extensions{a} python3-yaml{a} python3.12{a} python3.12-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, 122 newly installed, 0 to remove and 0 not upgraded. Need to get 178 MB of archives. After unpacking 960 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian trixie/main amd64 libpython3.12-minimal amd64 3.12.8-3 [817 kB] Get: 2 http://deb.debian.org/debian trixie/main amd64 libexpat1 amd64 2.6.4-1 [106 kB] Get: 3 http://deb.debian.org/debian trixie/main amd64 python3.12-minimal amd64 3.12.8-3 [2162 kB] Get: 4 http://deb.debian.org/debian trixie/main amd64 python3-minimal amd64 3.12.7-1 [26.8 kB] Get: 5 http://deb.debian.org/debian trixie/main amd64 media-types all 10.1.0 [26.9 kB] Get: 6 http://deb.debian.org/debian trixie/main amd64 netbase all 6.4 [12.8 kB] Get: 7 http://deb.debian.org/debian trixie/main amd64 tzdata all 2024b-4 [256 kB] Get: 8 http://deb.debian.org/debian trixie/main amd64 libkrb5support0 amd64 1.21.3-3 [32.5 kB] Get: 9 http://deb.debian.org/debian trixie/main amd64 libcom-err2 amd64 1.47.2~rc1-2 [23.8 kB] Get: 10 http://deb.debian.org/debian trixie/main amd64 libk5crypto3 amd64 1.21.3-3 [79.9 kB] Get: 11 http://deb.debian.org/debian trixie/main amd64 libkeyutils1 amd64 1.6.3-4 [9092 B] Get: 12 http://deb.debian.org/debian trixie/main amd64 libkrb5-3 amd64 1.21.3-3 [324 kB] Get: 13 http://deb.debian.org/debian trixie/main amd64 libgssapi-krb5-2 amd64 1.21.3-3 [136 kB] Get: 14 http://deb.debian.org/debian trixie/main amd64 libtirpc-common all 1.3.4+ds-1.3 [10.9 kB] Get: 15 http://deb.debian.org/debian trixie/main amd64 libtirpc3t64 amd64 1.3.4+ds-1.3+b1 [83.1 kB] Get: 16 http://deb.debian.org/debian trixie/main amd64 libnsl2 amd64 1.3.0-3+b3 [40.6 kB] Get: 17 http://deb.debian.org/debian trixie/main amd64 readline-common all 8.2-6 [69.4 kB] Get: 18 http://deb.debian.org/debian trixie/main amd64 libreadline8t64 amd64 8.2-6 [169 kB] Get: 19 http://deb.debian.org/debian trixie/main amd64 libpython3.12-stdlib amd64 3.12.8-3 [1969 kB] Get: 20 http://deb.debian.org/debian trixie/main amd64 python3.12 amd64 3.12.8-3 [677 kB] Get: 21 http://deb.debian.org/debian trixie/main amd64 libpython3-stdlib amd64 3.12.7-1 [9712 B] Get: 22 http://deb.debian.org/debian trixie/main amd64 python3 amd64 3.12.7-1 [27.8 kB] Get: 23 http://deb.debian.org/debian trixie/main amd64 sensible-utils all 0.0.24 [24.8 kB] Get: 24 http://deb.debian.org/debian trixie/main amd64 libmagic-mgc amd64 1:5.45-3+b1 [314 kB] Get: 25 http://deb.debian.org/debian trixie/main amd64 libmagic1t64 amd64 1:5.45-3+b1 [108 kB] Get: 26 http://deb.debian.org/debian trixie/main amd64 file amd64 1:5.45-3+b1 [43.3 kB] Get: 27 http://deb.debian.org/debian trixie/main amd64 gettext-base amd64 0.22.5-3 [200 kB] Get: 28 http://deb.debian.org/debian trixie/main amd64 libuchardet0 amd64 0.0.8-1+b2 [68.9 kB] Get: 29 http://deb.debian.org/debian trixie/main amd64 groff-base amd64 1.23.0-6 [1184 kB] Get: 30 http://deb.debian.org/debian trixie/main amd64 bsdextrautils amd64 2.40.2-12 [92.0 kB] Get: 31 http://deb.debian.org/debian trixie/main amd64 libpipeline1 amd64 1.5.8-1 [42.0 kB] Get: 32 http://deb.debian.org/debian trixie/main amd64 man-db amd64 2.13.0-1 [1420 kB] Get: 33 http://deb.debian.org/debian trixie/main amd64 m4 amd64 1.4.19-4 [287 kB] Get: 34 http://deb.debian.org/debian trixie/main amd64 autoconf all 2.72-3 [493 kB] Get: 35 http://deb.debian.org/debian trixie/main amd64 autotools-dev all 20220109.1 [51.6 kB] Get: 36 http://deb.debian.org/debian trixie/main amd64 automake all 1:1.16.5-1.3 [823 kB] Get: 37 http://deb.debian.org/debian trixie/main amd64 autopoint all 0.22.5-3 [723 kB] Get: 38 http://deb.debian.org/debian trixie/main amd64 libevent-2.1-7t64 amd64 2.1.12-stable-10+b1 [182 kB] Get: 39 http://deb.debian.org/debian trixie/main amd64 libgc1 amd64 1:8.2.8-1 [247 kB] Get: 40 http://deb.debian.org/debian trixie/main amd64 libedit2 amd64 3.1-20240808-1 [93.9 kB] Get: 41 http://deb.debian.org/debian trixie/main amd64 libicu72 amd64 72.1-5+b1 [9423 kB] Get: 42 http://deb.debian.org/debian trixie/main amd64 libxml2 amd64 2.12.7+dfsg+really2.9.14-0.2+b1 [699 kB] Get: 43 http://deb.debian.org/debian trixie/main amd64 libz3-4 amd64 4.13.3-1 [8560 kB] Get: 44 http://deb.debian.org/debian trixie/main amd64 libllvm19 amd64 1:19.1.6-1 [26.0 MB] Get: 45 http://deb.debian.org/debian trixie/main amd64 libgc-dev amd64 1:8.2.8-1 [416 kB] Get: 46 http://deb.debian.org/debian trixie/main amd64 libpkgconf3 amd64 1.8.1-4 [36.4 kB] Get: 47 http://deb.debian.org/debian trixie/main amd64 pkgconf-bin amd64 1.8.1-4 [30.2 kB] Get: 48 http://deb.debian.org/debian trixie/main amd64 pkgconf amd64 1.8.1-4 [26.2 kB] Get: 49 http://deb.debian.org/debian trixie/main amd64 libpcre2-16-0 amd64 10.44-5 [260 kB] Get: 50 http://deb.debian.org/debian trixie/main amd64 libpcre2-32-0 amd64 10.44-5 [248 kB] Get: 51 http://deb.debian.org/debian trixie/main amd64 libpcre2-posix3 amd64 10.44-5 [60.4 kB] Get: 52 http://deb.debian.org/debian trixie/main amd64 libpcre2-dev amd64 10.44-5 [790 kB] Get: 53 http://deb.debian.org/debian trixie/main amd64 libevent-core-2.1-7t64 amd64 2.1.12-stable-10+b1 [132 kB] Get: 54 http://deb.debian.org/debian trixie/main amd64 libevent-extra-2.1-7t64 amd64 2.1.12-stable-10+b1 [108 kB] Get: 55 http://deb.debian.org/debian trixie/main amd64 libevent-pthreads-2.1-7t64 amd64 2.1.12-stable-10+b1 [54.3 kB] Get: 56 http://deb.debian.org/debian trixie/main amd64 libevent-openssl-2.1-7t64 amd64 2.1.12-stable-10+b1 [61.1 kB] Get: 57 http://deb.debian.org/debian trixie/main amd64 libevent-dev amd64 2.1.12-stable-10+b1 [305 kB] Get: 58 http://deb.debian.org/debian trixie/main amd64 libjs-codemirror all 5.65.0+~cs5.83.9-3 [774 kB] Get: 59 http://deb.debian.org/debian trixie/main amd64 libjs-jquery all 3.6.1+dfsg+~3.5.14-1 [326 kB] Get: 60 http://deb.debian.org/debian trixie/main amd64 crystal amd64 1.14.0+dfsg-1 [4375 kB] Get: 61 http://deb.debian.org/debian trixie/main amd64 libdebhelper-perl all 13.20 [89.7 kB] Get: 62 http://deb.debian.org/debian trixie/main amd64 libtool all 2.4.7-8 [517 kB] Get: 63 http://deb.debian.org/debian trixie/main amd64 dh-autoreconf all 20 [17.1 kB] Get: 64 http://deb.debian.org/debian trixie/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get: 65 http://deb.debian.org/debian trixie/main amd64 libfile-stripnondeterminism-perl all 1.14.0-1 [19.5 kB] Get: 66 http://deb.debian.org/debian trixie/main amd64 dh-strip-nondeterminism all 1.14.0-1 [8448 B] Get: 67 http://deb.debian.org/debian trixie/main amd64 libelf1t64 amd64 0.192-4 [189 kB] Get: 68 http://deb.debian.org/debian trixie/main amd64 dwz amd64 0.15-1+b1 [110 kB] Get: 69 http://deb.debian.org/debian trixie/main amd64 gettext amd64 0.22.5-3 [1600 kB] Get: 70 http://deb.debian.org/debian trixie/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 71 http://deb.debian.org/debian trixie/main amd64 po-debconf all 1.0.21+nmu1 [248 kB] Get: 72 http://deb.debian.org/debian trixie/main amd64 debhelper all 13.20 [915 kB] Get: 73 http://deb.debian.org/debian trixie/main amd64 libbrotli1 amd64 1.1.0-2+b6 [302 kB] Get: 74 http://deb.debian.org/debian trixie/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-8 [19.6 kB] Get: 75 http://deb.debian.org/debian trixie/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-8 [57.3 kB] Get: 76 http://deb.debian.org/debian trixie/main amd64 libldap-2.5-0 amd64 2.5.18+dfsg-3+b1 [188 kB] Get: 77 http://deb.debian.org/debian trixie/main amd64 libnghttp2-14 amd64 1.64.0-1 [75.5 kB] Get: 78 http://deb.debian.org/debian trixie/main amd64 libnghttp3-9 amd64 1.6.0-2 [64.8 kB] Get: 79 http://deb.debian.org/debian trixie/main amd64 libngtcp2-16 amd64 1.9.1-1 [119 kB] Get: 80 http://deb.debian.org/debian trixie/main amd64 libngtcp2-crypto-gnutls8 amd64 1.9.1-1 [18.5 kB] Get: 81 http://deb.debian.org/debian trixie/main amd64 libpsl5t64 amd64 0.21.2-1.1+b1 [57.2 kB] Get: 82 http://deb.debian.org/debian trixie/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-2+b5 [58.8 kB] Get: 83 http://deb.debian.org/debian trixie/main amd64 libssh2-1t64 amd64 1.11.1-1 [245 kB] Get: 84 http://deb.debian.org/debian trixie/main amd64 libcurl3t64-gnutls amd64 8.11.1-1 [360 kB] Get: 85 http://deb.debian.org/debian trixie/main amd64 liberror-perl all 0.17029-2 [29.0 kB] Get: 86 http://deb.debian.org/debian trixie/main amd64 git-man all 1:2.45.2-1 [2158 kB] Get: 87 http://deb.debian.org/debian trixie/main amd64 git amd64 1:2.45.2-1 [8645 kB] Get: 88 http://deb.debian.org/debian trixie/main amd64 icu-devtools amd64 72.1-5+b1 [210 kB] Get: 89 http://deb.debian.org/debian trixie/main amd64 libmd-dev amd64 1.1.0-2+b1 [55.3 kB] Get: 90 http://deb.debian.org/debian trixie/main amd64 libbsd-dev amd64 0.12.2-2 [258 kB] Get: 91 http://deb.debian.org/debian trixie/main amd64 libclang-cpp19 amd64 1:19.1.6-1 [13.2 MB] Get: 92 http://deb.debian.org/debian trixie/main amd64 libcurl4t64 amd64 8.11.1-1 [351 kB] Get: 93 http://deb.debian.org/debian trixie/main amd64 libncurses6 amd64 6.5-2+b1 [105 kB] Get: 94 http://deb.debian.org/debian trixie/main amd64 libncurses-dev amd64 6.5-2+b1 [351 kB] Get: 95 http://deb.debian.org/debian trixie/main amd64 libedit-dev amd64 3.1-20240808-1 [114 kB] Get: 96 http://deb.debian.org/debian trixie/main amd64 libffi-dev amd64 3.4.6-1 [60.6 kB] Get: 97 http://deb.debian.org/debian trixie/main amd64 libgmpxx4ldbl amd64 2:6.3.0+dfsg-3 [329 kB] Get: 98 http://deb.debian.org/debian trixie/main amd64 libgmp-dev amd64 2:6.3.0+dfsg-3 [642 kB] Get: 99 http://deb.debian.org/debian trixie/main amd64 libicu-dev amd64 72.1-5+b1 [10.4 MB] Get: 100 http://deb.debian.org/debian trixie/main amd64 libpfm4 amd64 4.13.0+git83-g91970fe-1 [368 kB] Get: 101 http://deb.debian.org/debian trixie/main amd64 libssl-dev amd64 3.3.2-2 [2742 kB] Get: 102 http://deb.debian.org/debian trixie/main amd64 libxml2-dev amd64 2.12.7+dfsg+really2.9.14-0.2+b1 [795 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.6-1 [1374 kB] Get: 107 http://deb.debian.org/debian trixie/main amd64 llvm-19-runtime amd64 1:19.1.6-1 [550 kB] Get: 108 http://deb.debian.org/debian trixie/main amd64 llvm-19-linker-tools amd64 1:19.1.6-1 [1260 kB] Get: 109 http://deb.debian.org/debian trixie/main amd64 llvm-19 amd64 1:19.1.6-1 [16.4 MB] Get: 110 http://deb.debian.org/debian trixie/main amd64 python3-autocommand all 2.2.2-3 [13.6 kB] Get: 111 http://deb.debian.org/debian trixie/main amd64 python3-more-itertools all 10.5.0-1 [63.8 kB] Get: 112 http://deb.debian.org/debian trixie/main amd64 python3-typing-extensions all 4.12.2-2 [73.0 kB] Get: 113 http://deb.debian.org/debian trixie/main amd64 python3-typeguard all 4.4.1-1 [37.0 kB] Get: 114 http://deb.debian.org/debian trixie/main amd64 python3-inflect all 7.3.1-2 [32.4 kB] Get: 115 http://deb.debian.org/debian trixie/main amd64 python3-jaraco.context all 6.0.0-1 [7984 B] Get: 116 http://deb.debian.org/debian trixie/main amd64 python3-jaraco.functools all 4.1.0-1 [12.0 kB] Get: 117 http://deb.debian.org/debian trixie/main amd64 python3-pkg-resources all 75.6.0-1 [222 kB] Get: 118 http://deb.debian.org/debian trixie/main amd64 python3-pygments all 2.18.0+dfsg-1 [836 kB] Get: 119 http://deb.debian.org/debian trixie/main amd64 python3-yaml amd64 6.0.2-1+b1 [178 kB] Get: 120 http://deb.debian.org/debian trixie/main amd64 llvm-19-tools amd64 1:19.1.6-1 [511 kB] Get: 121 http://deb.debian.org/debian trixie/main amd64 llvm-19-dev amd64 1:19.1.6-1 [43.2 MB] Get: 122 http://deb.debian.org/debian trixie/main amd64 zlib1g-dev amd64 1:1.3.dfsg+really1.3.1-1+b1 [920 kB] Fetched 178 MB in 9s (20.9 MB/s) debconf: delaying package configuration, since apt-utils is not installed Selecting previously unselected package libpython3.12-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 ... 19966 files and directories currently installed.) Preparing to unpack .../libpython3.12-minimal_3.12.8-3_amd64.deb ... Unpacking libpython3.12-minimal:amd64 (3.12.8-3) ... Selecting previously unselected package libexpat1:amd64. Preparing to unpack .../libexpat1_2.6.4-1_amd64.deb ... Unpacking libexpat1:amd64 (2.6.4-1) ... Selecting previously unselected package python3.12-minimal. Preparing to unpack .../python3.12-minimal_3.12.8-3_amd64.deb ... Unpacking python3.12-minimal (3.12.8-3) ... Setting up libpython3.12-minimal:amd64 (3.12.8-3) ... Setting up libexpat1:amd64 (2.6.4-1) ... Setting up python3.12-minimal (3.12.8-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 ... 20286 files and directories currently installed.) Preparing to unpack .../00-python3-minimal_3.12.7-1_amd64.deb ... Unpacking python3-minimal (3.12.7-1) ... Selecting previously unselected package media-types. Preparing to unpack .../01-media-types_10.1.0_all.deb ... Unpacking media-types (10.1.0) ... Selecting previously unselected package netbase. Preparing to unpack .../02-netbase_6.4_all.deb ... Unpacking netbase (6.4) ... Selecting previously unselected package tzdata. Preparing to unpack .../03-tzdata_2024b-4_all.deb ... Unpacking tzdata (2024b-4) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../04-libkrb5support0_1.21.3-3_amd64.deb ... Unpacking libkrb5support0:amd64 (1.21.3-3) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../05-libcom-err2_1.47.2~rc1-2_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.2~rc1-2) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../06-libk5crypto3_1.21.3-3_amd64.deb ... Unpacking libk5crypto3:amd64 (1.21.3-3) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../07-libkeyutils1_1.6.3-4_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-4) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../08-libkrb5-3_1.21.3-3_amd64.deb ... Unpacking libkrb5-3:amd64 (1.21.3-3) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../09-libgssapi-krb5-2_1.21.3-3_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.21.3-3) ... Selecting previously unselected package libtirpc-common. Preparing to unpack .../10-libtirpc-common_1.3.4+ds-1.3_all.deb ... Unpacking libtirpc-common (1.3.4+ds-1.3) ... Selecting previously unselected package libtirpc3t64:amd64. Preparing to unpack .../11-libtirpc3t64_1.3.4+ds-1.3+b1_amd64.deb ... Adding 'diversion of /lib/x86_64-linux-gnu/libtirpc.so.3 to /lib/x86_64-linux-gnu/libtirpc.so.3.usr-is-merged by libtirpc3t64' Adding 'diversion of /lib/x86_64-linux-gnu/libtirpc.so.3.0.0 to /lib/x86_64-linux-gnu/libtirpc.so.3.0.0.usr-is-merged by libtirpc3t64' Unpacking libtirpc3t64:amd64 (1.3.4+ds-1.3+b1) ... Selecting previously unselected package libnsl2:amd64. Preparing to unpack .../12-libnsl2_1.3.0-3+b3_amd64.deb ... Unpacking libnsl2:amd64 (1.3.0-3+b3) ... Selecting previously unselected package readline-common. Preparing to unpack .../13-readline-common_8.2-6_all.deb ... Unpacking readline-common (8.2-6) ... Selecting previously unselected package libreadline8t64:amd64. Preparing to unpack .../14-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.12-stdlib:amd64. Preparing to unpack .../15-libpython3.12-stdlib_3.12.8-3_amd64.deb ... Unpacking libpython3.12-stdlib:amd64 (3.12.8-3) ... Selecting previously unselected package python3.12. Preparing to unpack .../16-python3.12_3.12.8-3_amd64.deb ... Unpacking python3.12 (3.12.8-3) ... Selecting previously unselected package libpython3-stdlib:amd64. Preparing to unpack .../17-libpython3-stdlib_3.12.7-1_amd64.deb ... Unpacking libpython3-stdlib:amd64 (3.12.7-1) ... Setting up python3-minimal (3.12.7-1) ... 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 ... 21349 files and directories currently installed.) Preparing to unpack .../000-python3_3.12.7-1_amd64.deb ... Unpacking python3 (3.12.7-1) ... 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.22.5-3_amd64.deb ... Unpacking gettext-base (0.22.5-3) ... 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-6_amd64.deb ... Unpacking groff-base (1.23.0-6) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../008-bsdextrautils_2.40.2-12_amd64.deb ... Unpacking bsdextrautils (2.40.2-12) ... 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-4_amd64.deb ... Unpacking m4 (1.4.19-4) ... 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_20220109.1_all.deb ... Unpacking autotools-dev (20220109.1) ... Selecting previously unselected package automake. Preparing to unpack .../014-automake_1%3a1.16.5-1.3_all.deb ... Unpacking automake (1:1.16.5-1.3) ... Selecting previously unselected package autopoint. Preparing to unpack .../015-autopoint_0.22.5-3_all.deb ... Unpacking autopoint (0.22.5-3) ... 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-20240808-1_amd64.deb ... Unpacking libedit2:amd64 (3.1-20240808-1) ... Selecting previously unselected package libicu72:amd64. Preparing to unpack .../019-libicu72_72.1-5+b1_amd64.deb ... Unpacking libicu72:amd64 (72.1-5+b1) ... Selecting previously unselected package libxml2:amd64. Preparing to unpack .../020-libxml2_2.12.7+dfsg+really2.9.14-0.2+b1_amd64.deb ... Unpacking libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) ... Selecting previously unselected package libz3-4:amd64. Preparing to unpack .../021-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 .../022-libllvm19_1%3a19.1.6-1_amd64.deb ... Unpacking libllvm19:amd64 (1:19.1.6-1) ... Selecting previously unselected package libgc-dev:amd64. Preparing to unpack .../023-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 .../024-libpkgconf3_1.8.1-4_amd64.deb ... Unpacking libpkgconf3:amd64 (1.8.1-4) ... Selecting previously unselected package pkgconf-bin. Preparing to unpack .../025-pkgconf-bin_1.8.1-4_amd64.deb ... Unpacking pkgconf-bin (1.8.1-4) ... Selecting previously unselected package pkgconf:amd64. Preparing to unpack .../026-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 .../027-libpcre2-16-0_10.44-5_amd64.deb ... Unpacking libpcre2-16-0:amd64 (10.44-5) ... Selecting previously unselected package libpcre2-32-0:amd64. Preparing to unpack .../028-libpcre2-32-0_10.44-5_amd64.deb ... Unpacking libpcre2-32-0:amd64 (10.44-5) ... Selecting previously unselected package libpcre2-posix3:amd64. Preparing to unpack .../029-libpcre2-posix3_10.44-5_amd64.deb ... Unpacking libpcre2-posix3:amd64 (10.44-5) ... Selecting previously unselected package libpcre2-dev:amd64. Preparing to unpack .../030-libpcre2-dev_10.44-5_amd64.deb ... Unpacking libpcre2-dev:amd64 (10.44-5) ... Selecting previously unselected package libevent-core-2.1-7t64:amd64. Preparing to unpack .../031-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 .../032-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 .../033-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 .../034-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 .../035-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 .../036-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 .../037-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 .../038-crystal_1.14.0+dfsg-1_amd64.deb ... Unpacking crystal (1.14.0+dfsg-1) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../039-libdebhelper-perl_13.20_all.deb ... Unpacking libdebhelper-perl (13.20) ... Selecting previously unselected package libtool. Preparing to unpack .../040-libtool_2.4.7-8_all.deb ... Unpacking libtool (2.4.7-8) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../041-dh-autoreconf_20_all.deb ... Unpacking dh-autoreconf (20) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../042-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 .../043-libfile-stripnondeterminism-perl_1.14.0-1_all.deb ... Unpacking libfile-stripnondeterminism-perl (1.14.0-1) ... Selecting previously unselected package dh-strip-nondeterminism. Preparing to unpack .../044-dh-strip-nondeterminism_1.14.0-1_all.deb ... Unpacking dh-strip-nondeterminism (1.14.0-1) ... Selecting previously unselected package libelf1t64:amd64. Preparing to unpack .../045-libelf1t64_0.192-4_amd64.deb ... Unpacking libelf1t64:amd64 (0.192-4) ... Selecting previously unselected package dwz. Preparing to unpack .../046-dwz_0.15-1+b1_amd64.deb ... Unpacking dwz (0.15-1+b1) ... Selecting previously unselected package gettext. Preparing to unpack .../047-gettext_0.22.5-3_amd64.deb ... Unpacking gettext (0.22.5-3) ... 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.20_all.deb ... Unpacking debhelper (13.20) ... Selecting previously unselected package libbrotli1:amd64. Preparing to unpack .../051-libbrotli1_1.1.0-2+b6_amd64.deb ... Unpacking libbrotli1:amd64 (1.1.0-2+b6) ... Selecting previously unselected package libsasl2-modules-db:amd64. Preparing to unpack .../052-libsasl2-modules-db_2.1.28+dfsg1-8_amd64.deb ... Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-8) ... Selecting previously unselected package libsasl2-2:amd64. Preparing to unpack .../053-libsasl2-2_2.1.28+dfsg1-8_amd64.deb ... Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-8) ... Selecting previously unselected package libldap-2.5-0:amd64. Preparing to unpack .../054-libldap-2.5-0_2.5.18+dfsg-3+b1_amd64.deb ... Unpacking libldap-2.5-0:amd64 (2.5.18+dfsg-3+b1) ... Selecting previously unselected package libnghttp2-14:amd64. Preparing to unpack .../055-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 .../056-libnghttp3-9_1.6.0-2_amd64.deb ... Unpacking libnghttp3-9:amd64 (1.6.0-2) ... Selecting previously unselected package libngtcp2-16:amd64. Preparing to unpack .../057-libngtcp2-16_1.9.1-1_amd64.deb ... Unpacking libngtcp2-16:amd64 (1.9.1-1) ... Selecting previously unselected package libngtcp2-crypto-gnutls8:amd64. Preparing to unpack .../058-libngtcp2-crypto-gnutls8_1.9.1-1_amd64.deb ... Unpacking libngtcp2-crypto-gnutls8:amd64 (1.9.1-1) ... Selecting previously unselected package libpsl5t64:amd64. Preparing to unpack .../059-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 .../060-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 .../061-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 .../062-libcurl3t64-gnutls_8.11.1-1_amd64.deb ... Unpacking libcurl3t64-gnutls:amd64 (8.11.1-1) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../063-liberror-perl_0.17029-2_all.deb ... Unpacking liberror-perl (0.17029-2) ... Selecting previously unselected package git-man. Preparing to unpack .../064-git-man_1%3a2.45.2-1_all.deb ... Unpacking git-man (1:2.45.2-1) ... Selecting previously unselected package git. Preparing to unpack .../065-git_1%3a2.45.2-1_amd64.deb ... Unpacking git (1:2.45.2-1) ... Selecting previously unselected package icu-devtools. Preparing to unpack .../066-icu-devtools_72.1-5+b1_amd64.deb ... Unpacking icu-devtools (72.1-5+b1) ... Selecting previously unselected package libmd-dev:amd64. Preparing to unpack .../067-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 .../068-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 .../069-libclang-cpp19_1%3a19.1.6-1_amd64.deb ... Unpacking libclang-cpp19 (1:19.1.6-1) ... Selecting previously unselected package libcurl4t64:amd64. Preparing to unpack .../070-libcurl4t64_8.11.1-1_amd64.deb ... Unpacking libcurl4t64:amd64 (8.11.1-1) ... Selecting previously unselected package libncurses6:amd64. Preparing to unpack .../071-libncurses6_6.5-2+b1_amd64.deb ... Unpacking libncurses6:amd64 (6.5-2+b1) ... Selecting previously unselected package libncurses-dev:amd64. Preparing to unpack .../072-libncurses-dev_6.5-2+b1_amd64.deb ... Unpacking libncurses-dev:amd64 (6.5-2+b1) ... Selecting previously unselected package libedit-dev:amd64. Preparing to unpack .../073-libedit-dev_3.1-20240808-1_amd64.deb ... Unpacking libedit-dev:amd64 (3.1-20240808-1) ... Selecting previously unselected package libffi-dev:amd64. Preparing to unpack .../074-libffi-dev_3.4.6-1_amd64.deb ... Unpacking libffi-dev:amd64 (3.4.6-1) ... Selecting previously unselected package libgmpxx4ldbl:amd64. Preparing to unpack .../075-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 .../076-libgmp-dev_2%3a6.3.0+dfsg-3_amd64.deb ... Unpacking libgmp-dev:amd64 (2:6.3.0+dfsg-3) ... Selecting previously unselected package libicu-dev:amd64. Preparing to unpack .../077-libicu-dev_72.1-5+b1_amd64.deb ... Unpacking libicu-dev:amd64 (72.1-5+b1) ... Selecting previously unselected package libpfm4:amd64. Preparing to unpack .../078-libpfm4_4.13.0+git83-g91970fe-1_amd64.deb ... Unpacking libpfm4:amd64 (4.13.0+git83-g91970fe-1) ... Selecting previously unselected package libssl-dev:amd64. Preparing to unpack .../079-libssl-dev_3.3.2-2_amd64.deb ... Unpacking libssl-dev:amd64 (3.3.2-2) ... Selecting previously unselected package libxml2-dev:amd64. Preparing to unpack .../080-libxml2-dev_2.12.7+dfsg+really2.9.14-0.2+b1_amd64.deb ... Unpacking libxml2-dev:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) ... Selecting previously unselected package libyaml-0-2:amd64. Preparing to unpack .../081-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 .../082-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 .../083-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 .../084-lld-19_1%3a19.1.6-1_amd64.deb ... Unpacking lld-19 (1:19.1.6-1) ... Selecting previously unselected package llvm-19-runtime. Preparing to unpack .../085-llvm-19-runtime_1%3a19.1.6-1_amd64.deb ... Unpacking llvm-19-runtime (1:19.1.6-1) ... Selecting previously unselected package llvm-19-linker-tools. Preparing to unpack .../086-llvm-19-linker-tools_1%3a19.1.6-1_amd64.deb ... Unpacking llvm-19-linker-tools (1:19.1.6-1) ... Selecting previously unselected package llvm-19. Preparing to unpack .../087-llvm-19_1%3a19.1.6-1_amd64.deb ... Unpacking llvm-19 (1:19.1.6-1) ... Selecting previously unselected package python3-autocommand. Preparing to unpack .../088-python3-autocommand_2.2.2-3_all.deb ... Unpacking python3-autocommand (2.2.2-3) ... Selecting previously unselected package python3-more-itertools. Preparing to unpack .../089-python3-more-itertools_10.5.0-1_all.deb ... Unpacking python3-more-itertools (10.5.0-1) ... Selecting previously unselected package python3-typing-extensions. Preparing to unpack .../090-python3-typing-extensions_4.12.2-2_all.deb ... Unpacking python3-typing-extensions (4.12.2-2) ... Selecting previously unselected package python3-typeguard. Preparing to unpack .../091-python3-typeguard_4.4.1-1_all.deb ... Unpacking python3-typeguard (4.4.1-1) ... Selecting previously unselected package python3-inflect. Preparing to unpack .../092-python3-inflect_7.3.1-2_all.deb ... Unpacking python3-inflect (7.3.1-2) ... Selecting previously unselected package python3-jaraco.context. Preparing to unpack .../093-python3-jaraco.context_6.0.0-1_all.deb ... Unpacking python3-jaraco.context (6.0.0-1) ... Selecting previously unselected package python3-jaraco.functools. Preparing to unpack .../094-python3-jaraco.functools_4.1.0-1_all.deb ... Unpacking python3-jaraco.functools (4.1.0-1) ... Selecting previously unselected package python3-pkg-resources. Preparing to unpack .../095-python3-pkg-resources_75.6.0-1_all.deb ... Unpacking python3-pkg-resources (75.6.0-1) ... Selecting previously unselected package python3-pygments. Preparing to unpack .../096-python3-pygments_2.18.0+dfsg-1_all.deb ... Unpacking python3-pygments (2.18.0+dfsg-1) ... Selecting previously unselected package python3-yaml. Preparing to unpack .../097-python3-yaml_6.0.2-1+b1_amd64.deb ... Unpacking python3-yaml (6.0.2-1+b1) ... Selecting previously unselected package llvm-19-tools. Preparing to unpack .../098-llvm-19-tools_1%3a19.1.6-1_amd64.deb ... Unpacking llvm-19-tools (1:19.1.6-1) ... Selecting previously unselected package llvm-19-dev. Preparing to unpack .../099-llvm-19-dev_1%3a19.1.6-1_amd64.deb ... Unpacking llvm-19-dev (1:19.1.6-1) ... 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 (10.1.0) ... Setting up libpipeline1:amd64 (1.5.8-1) ... Setting up libkeyutils1:amd64 (1.6.3-4) ... Setting up libicu72:amd64 (72.1-5+b1) ... Setting up bsdextrautils (2.40.2-12) ... 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 libtirpc-common (1.3.4+ds-1.3) ... Setting up libdebhelper-perl (13.20) ... Setting up libbrotli1:amd64 (1.1.0-2+b6) ... Setting up libedit2:amd64 (3.1-20240808-1) ... Setting up libmagic1t64:amd64 (1:5.45-3+b1) ... Setting up libpsl5t64:amd64 (0.21.2-1.1+b1) ... Setting up libnghttp2-14:amd64 (1.64.0-1) ... Setting up gettext-base (0.22.5-3) ... Setting up m4 (1.4.19-4) ... Setting up libevent-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libcom-err2:amd64 (1.47.2~rc1-2) ... Setting up file (1:5.45-3+b1) ... Setting up libffi-dev:amd64 (3.4.6-1) ... Setting up libpcre2-16-0:amd64 (10.44-5) ... Setting up libelf1t64:amd64 (0.192-4) ... Setting up libkrb5support0:amd64 (1.21.3-3) ... Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-8) ... Setting up tzdata (2024b-4) ... Current default time zone: 'Etc/UTC' Local time is now: Wed Jan 28 18:14:58 UTC 2026. Universal Time is now: Wed Jan 28 18:14:58 UTC 2026. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up liberror-perl (0.17029-2) ... Setting up autotools-dev (20220109.1) ... Setting up libz3-4:amd64 (4.13.3-1) ... Setting up libpcre2-32-0:amd64 (10.44-5) ... 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+git83-g91970fe-1) ... Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-2+b5) ... Setting up libncurses6:amd64 (6.5-2+b1) ... Setting up libjs-codemirror (5.65.0+~cs5.83.9-3) ... Setting up libssl-dev:amd64 (3.3.2-2) ... Setting up autopoint (0.22.5-3) ... Setting up icu-devtools (72.1-5+b1) ... Setting up pkgconf-bin (1.8.1-4) ... Setting up libk5crypto3:amd64 (1.21.3-3) ... Setting up libgc1:amd64 (1:8.2.8-1) ... Setting up libsasl2-2:amd64 (2.1.28+dfsg1-8) ... Setting up autoconf (2.72-3) ... Setting up libnghttp3-9:amd64 (1.6.0-2) ... Setting up zlib1g-dev:amd64 (1:1.3.dfsg+really1.3.1-1+b1) ... Setting up libpcre2-posix3:amd64 (10.44-5) ... 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 git-man (1:2.45.2-1) ... Setting up netbase (6.4) ... Setting up libngtcp2-16:amd64 (1.9.1-1) ... Setting up libkrb5-3:amd64 (1.21.3-3) ... 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 libicu-dev:amd64 (72.1-5+b1) ... Setting up libxml2:amd64 (2.12.7+dfsg+really2.9.14-0.2+b1) ... Setting up libbsd-dev:amd64 (0.12.2-2) ... Setting up libngtcp2-crypto-gnutls8:amd64 (1.9.1-1) ... Setting up automake (1:1.16.5-1.3) ... update-alternatives: using /usr/bin/automake-1.16 to provide /usr/bin/automake (automake) in auto mode Setting up libfile-stripnondeterminism-perl (1.14.0-1) ... Setting up libllvm19:amd64 (1:19.1.6-1) ... Setting up libz3-dev:amd64 (4.13.3-1) ... Setting up libncurses-dev:amd64 (6.5-2+b1) ... Setting up gettext (0.22.5-3) ... Setting up libgmp-dev:amd64 (2:6.3.0+dfsg-3) ... Setting up libpcre2-dev:amd64 (10.44-5) ... Setting up libyaml-dev:amd64 (0.2.5-2) ... Setting up libtool (2.4.7-8) ... 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 libldap-2.5-0:amd64 (2.5.18+dfsg-3+b1) ... 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.2+b1) ... Setting up libedit-dev:amd64 (3.1-20240808-1) ... Setting up libgssapi-krb5-2:amd64 (1.21.3-3) ... 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.0-1) ... Setting up groff-base (1.23.0-6) ... Setting up llvm-19-linker-tools (1:19.1.6-1) ... Setting up llvm-19-runtime (1:19.1.6-1) ... Setting up lld-19 (1:19.1.6-1) ... Setting up libclang-cpp19 (1:19.1.6-1) ... Setting up libcurl4t64:amd64 (8.11.1-1) ... Setting up libtirpc3t64:amd64 (1.3.4+ds-1.3+b1) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up libcurl3t64-gnutls:amd64 (8.11.1-1) ... Setting up man-db (2.13.0-1) ... Not building database; man-db/auto-update is not 'true'. Setting up libevent-dev (2.1.12-stable-10+b1) ... Setting up git (1:2.45.2-1) ... Setting up libnsl2:amd64 (1.3.0-3+b3) ... Setting up llvm-19 (1:19.1.6-1) ... Setting up crystal (1.14.0+dfsg-1) ... Setting up libpython3.12-stdlib:amd64 (3.12.8-3) ... Setting up python3.12 (3.12.8-3) ... Setting up debhelper (13.20) ... Setting up libpython3-stdlib:amd64 (3.12.7-1) ... Setting up python3 (3.12.7-1) ... Setting up python3-autocommand (2.2.2-3) ... Setting up python3-typing-extensions (4.12.2-2) ... Setting up python3-more-itertools (10.5.0-1) ... Setting up python3-jaraco.functools (4.1.0-1) ... Setting up python3-jaraco.context (6.0.0-1) ... Setting up python3-typeguard (4.4.1-1) ... Setting up python3-yaml (6.0.2-1+b1) ... Setting up python3-inflect (7.3.1-2) ... Setting up python3-pkg-resources (75.6.0-1) ... Setting up python3-pygments (2.18.0+dfsg-1) ... Setting up llvm-19-tools (1:19.1.6-1) ... Setting up llvm-19-dev (1:19.1.6-1) ... Processing triggers for libc-bin (2.40-4) ... 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.6] 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.6] 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_140232512899712' 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: 31438 Code gen: class codegens call to same instance codegens call to same instance codegens initialize with instance var codegens initialize with instance var reads a union type instance var (mixed union, second type) reads a union type instance var (mixed union, second type) invokes class method inside instance method (#1119) invokes class method inside instance method (#1119) makes .class always be a virtual type even if no subclasses makes .class always be a virtual type even if no subclasses notifies superclass recursively on inheritance (#576) notifies superclass recursively on inheritance (#576) allows fixing an instance variable's type allows fixing an instance variable's type codegens class method codegens class method runs with nilable instance var runs with nilable instance var doesn't crash on #1216 doesn't crash on #1216 runs instance variable initializer at the class level, for generic type runs instance variable initializer at the class level, for generic type doesn't crash on #1216 (reduced) doesn't crash on #1216 (reduced) transfers initializer from generic module to generic class transfers initializer from generic module to generic class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s for class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class does to_s on class codegens bug #168 codegens bug #168 codegens method of class union including Int (#1476) codegens method of class union including Int (#1476) uses number type var uses number type var does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) does to_s for virtual metaclass type (2) codegens assignment of generic metaclasses (4) (#10394) codegens assignment of generic metaclasses (4) (#10394) codegens assignment of generic metaclasses, base is non-generic (2) (#10394) codegens assignment of generic metaclasses, base is non-generic (2) (#10394) codegens virtual method of generic class codegens virtual method of generic class codegens recursive type codegens recursive type doesn't skip false initializers (#3272) doesn't skip false initializers (#3272) reads other instance var reads other instance var does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) does to_s for virtual metaclass type (3) codegens assignment of generic metaclasses (3) (#10394) codegens assignment of generic metaclasses (3) (#10394) can assign virtual metaclass to virtual metaclass (#3007) can assign virtual metaclass to virtual metaclass (#3007) reads a union type instance var (mixed union, first type) reads a union type instance var (mixed union, first type) builds generic class bug builds generic class bug resolves type declaration when accessing instance var (#348) resolves type declaration when accessing instance var (#348) codegens virtual generic class instance metaclass (#3819) codegens virtual generic class instance metaclass (#3819) allows initializing var with constant allows initializing var with constant doesn't crash on abstract class never instantiated (#2840) doesn't crash on abstract class never instantiated (#2840) transfers initializer from module to generic class transfers initializer from module to generic class codegens singleton (#718) codegens singleton (#718) allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope allows using self in class scope codegens assignment of generic metaclasses (2) (#10394) codegens assignment of generic metaclasses (2) (#10394) codegens assignment of generic metaclasses (1) (#10394) codegens assignment of generic metaclasses (1) (#10394) runs instance variable initializer at the class level runs instance variable initializer at the class level doesn't skip zero initializers (#3272) doesn't skip zero initializers (#3272) assigns type to reference union type assigns type to reference union type codegens method from another method without obj and accesses instance vars codegens method from another method without obj and accesses instance vars codegens method call of instance var codegens method call of instance var never considers read instance var as closure (#12181) never considers read instance var as closure (#12181) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) works with array in variable initializer in non-generic type (#855) gets class of virtual type gets class of virtual type codegens virtual call that calls another method codegens virtual call that calls another method reads a virtual type instance var reads a virtual type instance var reads a union type instance var (reference union, second type) reads a union type instance var (reference union, second type) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) does to_s for virtual metaclass type (1) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) works with array in variable initializer in generic type (#855) codegens assignment of generic metaclasses, base is non-generic (1) (#10394) codegens assignment of generic metaclasses, base is non-generic (1) (#10394) changes instance variable in method (ssa bug) changes instance variable in method (ssa bug) transfers initializer from generic module to non-generic class transfers initializer from generic module to non-generic class codegens new which calls initialize codegens new which calls initialize calls class method without self (2) calls class method without self (2) codegens class with recursive tuple to class (#4520) codegens class with recursive tuple to class (#4520) doesn't crash if not using undefined instance variable in superclass doesn't crash if not using undefined instance variable in superclass reads a union type instance var (reference union, first type) reads a union type instance var (reference union, first type) calls class method without self calls class method without self codegens instance var codegens instance var calls method on Class class calls method on Class class doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on #1216 with pointerof doesn't crash on #1216 with pointerof allows using self in class scope allows using self in class scope codegens virtual class method codegens virtual class method runs with nil instance var when inheriting runs with nil instance var when inheriting can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) can use a Main class (#1628) codegens virtual metaclass union bug (#2597) codegens virtual metaclass union bug (#2597) Code gen: named tuple codegens tuple nilable index (3) codegens tuple nilable index (3) doesn't error if NamedTuple includes a non-generic module (#10380) doesn't error if NamedTuple includes a non-generic module (#10380) provides T as a named tuple literal provides T as a named tuple literal merges two named tuple types with same keys but different types (2) merges two named tuple types with same keys but different types (2) upcasts named tuple inside union to union with compatible named tuple upcasts named tuple inside union to union with 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 assigns named tuple to compatible named tuple assigns named tuple to compatible named tuple allows named tuple covariance allows named tuple covariance gets keys at compile time (1) gets keys at compile time (1) assigns named tuple inside union to union with compatible named tuple assigns named tuple inside union to union with compatible named tuple codegens tuple index codegens tuple index assigns named tuple union to compatible named tuple assigns named tuple union to compatible named tuple 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 gets size at compile time gets size at compile time codegens tuple nilable index (2) codegens tuple nilable index (2) 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 (1) codegens tuple nilable index (1) codegens tuple index another order codegens tuple index another order doesn't crash when overload doesn't match doesn't crash when overload doesn't match merges two named tuple types with same keys but different types (1) merges two named tuple types with same keys but different types (1) accesses T and creates instance from it accesses T and creates instance from it downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) passes named tuple to def passes named tuple to def gets keys at compile time (2) gets keys at compile time (2) upcasts named tuple inside compatible named tuple upcasts named tuple inside compatible named tuple upcasts named tuple union to compatible named tuple upcasts named tuple union to compatible named tuple Crystal::Macro readinstancevar methods executes obj executes obj executes name executes name Crystal::AnnotationDef executes name executes name executes kind executes kind executes body executes body printing print print pp! pp! puts puts p! p! p p pp pp path methods executes global? executes global? executes types executes types executes global executes global executes resolve executes resolve executes names executes names executes resolve? executes resolve? char methods executes ord executes ord classvar methods executes name executes name Crystal::AsmOperand executes constraint executes constraint executes exp executes exp Crystal::FunDef executes has_body? executes has_body? executes variadic? executes variadic? executes real_name executes real_name executes body executes body executes return_type executes return_type executes name executes name executes args executes args is_a methods executes arg executes arg executes receiver executes receiver Crystal::MacroExpression executes output? executes output? executes exp executes exp env doesn't have key doesn't have key has key has key responds_to methods executes name executes name executes receiver executes receiver Crystal::MacroVar executes expressions executes expressions executes name executes name Crystal::TypeNode executes class_vars on symbol type executes class_vars on symbol type executes class_vars on metaclass executes class_vars on metaclass executes < executes < executes type_vars executes type_vars executes == executes == #id does not include trailing + for virtual type does not include trailing + for virtual type executes instance_vars on metaclass executes instance_vars on metaclass executes resolve? executes resolve? executes != executes != executes class vars executes class vars == and != devirtualize generic type arguments (#10730) == and != devirtualize generic type arguments (#10730) executes instance_vars on symbol type executes instance_vars on symbol type executes class methods executes class methods public? true true false false executes class vars (with inheritance) executes class vars (with inheritance) executes > executes > #name 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 with an invalid type argument should raise the proper exception should raise the proper exception 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 generic instance prints empty splat type var prints empty splat type var prints generic type arguments prints generic type arguments does not print extra commas for empty splat type var (2) does not print extra commas for empty splat type var (2) prints multiple arguments for splat type var prints multiple arguments for splat type var does not print extra commas for empty splat type var (3) does not print extra commas for empty splat type var (3) does not print extra commas for empty splat type var (1) does not print extra commas for empty splat type var (1) namespaced type should return the FQN of the type should return the FQN of the type simple type returns the name of the type returns the name of the type generic type includes the generic_args of the type by default includes the generic_args of the type by default includes the generic_args of the instantiated type by default includes the generic_args of the instantiated type by default #warning emits a warning at a specific node emits a warning at a specific node executes superclass executes superclass executes union_types (union) executes union_types (union) #class? Crystal::NonGenericClassType struct struct class class Crystal::GenericClassType struct struct class class Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType executes <= executes <= executes class executes class executes methods executes methods executes ancestors executes ancestors executes resolve executes resolve #includers returns an array of types `self` is directly included in returns an array of types `self` is directly included in executes union_types (non-union) executes union_types (non-union) #abstract? Crystal::GenericClassType struct abstract abstract non-abstract non-abstract class abstract abstract non-abstract non-abstract Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericClassType struct non-abstract non-abstract abstract abstract class non-abstract non-abstract abstract abstract Crystal::NonGenericModuleType Crystal::NonGenericModuleType visibility public public private private #has_inner_pointers? works on structs works on structs works on primitive values works on primitive values works on ReferenceStorage works on ReferenceStorage works on references works on references executes size of tuple metaclass executes size of tuple metaclass #module? Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericClassType struct struct class class Crystal::GenericClassType class class struct struct Crystal::GenericModuleType Crystal::GenericModuleType executes size of tuple executes size of tuple #union? false false true true #nilable? false false true true executes private? true true false false executes instance_vars executes instance_vars executes >= executes >= #struct? Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::GenericClassType class class struct struct Crystal::NonGenericClassType struct struct class class executes instance executes instance executes ancestors (with generic) executes ancestors (with generic) and methods executes right executes right executes left executes left Crystal::Alias executes type executes type executes name executes name require methods executes path executes path if methods executes then executes then executes else (nop) executes else (nop) executes cond executes cond executes else executes else annotation methods executes [] with NumberLiteral executes [] with NumberLiteral executes name executes name executes [] with MacroId executes [] with MacroId executes [] with SymbolLiteral executes [] with SymbolLiteral executes [] with StringLiteral executes [] with StringLiteral executes [] with other ASTNode, but raises an error executes [] with other ASTNode, but raises an error proc notation methods gets multiple inputs gets multiple inputs executes resolve? executes resolve? gets single output gets single output gets single input gets single input gets empty output gets empty output executes resolve executes resolve type declaration methods executes var executes var executes type executes type executes var when instance var executes var when instance var executes value executes value Crystal::NamedTupleLiteral executes values executes values executes to_a executes to_a executes empty? executes empty? executes map executes map executes has_key? executes has_key? #each without the value argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without either argument builds the correct array builds the correct array without the key argument builds the correct array builds the correct array executes double splat with arg executes double splat with arg creates a named tuple literal with a var creates a named tuple literal with a var executes [] with invalid key type executes [] with invalid key type executes []= executes []= executes keys executes keys executes double splat executes double splat executes double splat executes double splat executes [] not found executes [] not found executes is_a? executes is_a? executes size executes size executes [] executes [] Crystal::HashLiteral creates a hash literal with a var creates a hash literal with a var executes [] executes [] #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 has_key? executes has_key? executes of_key executes of_key executes of_value executes of_value executes values executes values executes double splat executes double splat executes type executes type executes size executes size executes map executes map executes double splat executes double splat executes []= executes []= executes to_a executes to_a executes [] not found executes [] not found executes double splat with arg executes double splat with arg executes type (nop) executes type (nop) executes keys executes keys executes is_a? executes is_a? executes empty? executes empty? executes of_value (nop) executes of_value (nop) executes of_key (nop) executes of_key (nop) instancevar methods executes name executes name Crystal::CStructOrUnionDef executes union? executes union? executes body executes body executes name executes name executes kind executes kind while methods executes cond executes cond executes body executes body metaclass methods executes instance executes instance executes resolve? executes resolve? executes resolve executes resolve Crystal::ClassDef executes name executes name executes body executes body executes splat_index executes splat_index executes superclass executes superclass executes struct? executes struct? executes abstract? executes abstract? executes type_vars executes type_vars executes kind executes kind executes assign without output executes assign without output node methods #doc_comment ensures each newline has a `#` prefix ensures each newline has a `#` prefix returns an empty MacroId if there are no docs on the node (wants_doc = false) returns an empty MacroId if there are no docs on the node (wants_doc = false) returns the call's docs if present as a MacroId (wants_doc = true) returns the call's docs if present as a MacroId (wants_doc = true) executes == on symbols (false) (#240) executes == on symbols (false) (#240) #doc returns the call's docs if present (wants_doc = true) returns the call's docs if present (wants_doc = true) returns an empty string if there are no docs on the node (wants_doc = false) returns an empty string if there are no docs on the node (wants_doc = false) returns a multiline comment returns a multiline comment executes != on numbers (false) executes != on numbers (false) id expands macro with id call on call expands macro with id call on call expands macro with id call on string expands macro with id call on string expands macro with id call on 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 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 symbol expands macro with id call on symbol executes == on numbers (false) executes == on numbers (false) executes == on numbers (true) executes == on numbers (true) executes != on numbers (true) executes != on numbers (true) class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name executes class_name location end line_number end line_number filename filename end column number end column number column number column number line_number line_number #nil? Nop Nop NumberLiteral NumberLiteral NilLiteral NilLiteral stringify expands macro with stringify call on string expands macro with stringify call on string expands macro with stringify call on call expands macro with stringify call on call expands macro with stringify call on symbol expands macro with stringify call on symbol expands macro with stringify call on number expands macro with stringify call on number #is_a? union argument, unimplemented types union argument, unimplemented types union argument, duplicate type union argument, duplicate type union argument union argument union argument, undefined types union argument, undefined types union argument, mergeable union argument, mergeable union argument, contains NoReturn union argument, contains NoReturn executes == on symbols (true) (#240) executes == on symbols (true) (#240) symbolize expands macro with symbolize call on symbol expands macro with symbolize call on symbol expands macro with symbolize call on id expands macro with symbolize call on id expands macro with symbolize call on string expands macro with symbolize call on string number methods executes < (true) executes < (true) executes ** executes ** executes <=> (returns nil) executes <=> (returns nil) executes % executes % executes <= (true) executes <= (true) executes // executes // executes >= (true) executes >= (true) #to_number #to_number executes << executes << executes & executes & executes + with float executes + with float executes + and preserves type executes + and preserves type executes | executes | executes >= (false) executes >= (false) executes * executes * executes unary - executes unary - executes > (true) executes > (true) executes unary + executes unary + executes unary ~ executes unary ~ executes >> executes >> preserves integer size (#10713) preserves integer size (#10713) executes - executes - executes <= (false) executes <= (false) executes <=> executes <=> executes ^ executes ^ executes kind executes kind executes > (false) executes > (false) executes + executes + executes < (false) executes < (false) executes math operations using U/Int128 executes math operations using U/Int128 expressions methods executes expressions executes expressions macro for methods executes body executes body executes exp executes exp executes vars executes vars def methods executes receiver executes receiver executes return_type executes return_type executes abstract? executes abstract? executes free_vars executes free_vars executes splat_index executes splat_index executes accepts_block? executes accepts_block? executes name executes name executes body executes body executes double_splat executes double_splat executes block_arg executes block_arg executes args executes args executes visibility executes visibility multi_assign methods executes values executes values executes targets executes targets case methods when executes when body executes when body executes when exhaustive? executes when exhaustive? executes whens executes whens executes when conds executes when conds executes else executes else executes exhaustive? executes exhaustive? executes cond executes cond in executes whens executes whens executes exhaustive? executes exhaustive? executes when exhaustive? executes when exhaustive? control expression methods executes exp executes exp executes exp (nop) executes exp (nop) metavar methods executes name executes name executes nothing executes nothing executes id executes id executes is_a? executes is_a? proc literal methods executes body executes body executes return_type executes return_type executes args executes args Crystal::TypeOf executes args executes args Crystal::Include executes name executes name macro methods executes block_arg executes block_arg executes body executes body executes visibility executes visibility executes double_splat executes double_splat executes name executes name executes args executes args executes splat_index executes splat_index flag? has flag has flag doesn't have flag doesn't have flag generic methods executes named_args executes named_args executes resolve executes resolve executes type_vars executes type_vars executes resolve? executes resolve? executes types executes types executes name executes name Crystal::TupleLiteral executes [] with range executes [] with range executes sort with numbers executes sort with numbers executes reject executes reject executes [] with 1 executes [] with 1 executes size executes size executes is_a? executes is_a? executes empty? executes empty? executes uniq executes uniq executes map executes map creates a tuple literal with a var creates a tuple literal with a var #map_with_index without either argument returns the resulting tuple returns the resulting tuple with both arguments returns the resulting tuple returns the resulting tuple without the index argument returns the resulting tuple returns the resulting tuple without the element argument returns the resulting tuple returns the resulting tuple executes join executes join executes splat with symbols and strings executes splat with symbols and strings #+ with ArrayLiteral argument concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral with TupleLiteral argument concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral executes all? (false) executes all? (false) executes find (finds) executes find (finds) executes sort with strings executes sort with strings executes [] with incomplete range executes [] with incomplete range executes any? (true) executes any? (true) executes unshift executes unshift executes find (doesn't find) executes find (doesn't find) executes sort with ids and strings executes sort with ids and strings executes [] with 0 executes [] with 0 executes map with arg executes map with arg #each #each executes map with constants executes map with constants executes first executes first executes includes? executes includes? executes join with strings executes join with strings executes [] with computed range executes [] with computed range executes splat with splat executes splat with splat executes push executes push executes select executes select executes splat executes splat executes [] out of bounds executes [] out of bounds executes any? (false) executes any? (false) #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 sort with ids executes sort with ids executes splat with arg executes splat with arg #- with TupleLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral with ArrayLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral executes last executes last executes all? (true) executes all? (true) offsetof methods executes offset executes offset executes type executes type union methods executes types executes types executes resolve executes resolve executes resolve? executes resolve? Crystal::LibDef executes kind executes kind executes body executes body executes name executes name visibility modifier methods executes exp executes exp executes visibility executes visibility cast methods executes to executes to executes obj executes obj Crystal::Extend executes name executes name global methods executes name executes name Crystal::Primitive executes name executes name Crystal::External executes is_a? executes is_a? proc pointer methods executes obj when present executes obj when present executes name executes name executes args when empty executes args when empty executes global? executes global? executes obj when absent executes obj when absent executes args when not empty executes args when not empty arg methods executes default_value executes default_value executes restriction executes restriction executes name executes name executes internal_name executes internal_name macro if methods executes else executes else executes cond executes cond executes then executes then nilable cast methods executes obj executes obj executes to executes to uninitialized var methods executes type executes type executes var executes var instancevar methods executes name executes name Crystal::MacroLiteral executes value executes value Crystal::ArrayLiteral executes type executes type executes last executes last executes push executes push executes splat with symbols and strings executes splat with symbols and strings executes [] with two numbers executes [] with two numbers executes of executes of executes index 0 executes index 0 executes all? (true) executes all? (true) executes any? (true) executes any? (true) executes map with arg executes map with arg executes [] with range executes [] with range executes [] with incomplete range executes [] with incomplete range executes size executes size executes sort with numbers executes sort with numbers executes splat executes splat calls block exactly once for each element in #sort_by calls block exactly once for each element in #sort_by executes splat with splat executes splat with splat executes join executes join executes type (nop) executes type (nop) executes []= executes []= executes reject executes reject executes [] with computed range executes [] with computed range executes is_a? executes is_a? executes find (doesn't find) executes find (doesn't find) executes sort_by executes sort_by executes first executes first #+ 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 map executes map executes uniq executes uniq executes any? (false) executes any? (false) executes reduce with no initial value executes reduce with no initial value executes sort with ids and strings executes sort with ids and strings executes all? (false) executes all? (false) executes identify executes identify #map_with_index without either argument returns the resulting array returns the resulting array without the element argument returns the resulting array returns the resulting array without the index argument returns the resulting array returns the resulting array with both arguments returns the resulting array returns the resulting array executes reduce with initial value executes reduce with initial value executes join with strings executes join with strings executes unshift executes unshift executes find (finds) executes find (finds) #- 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 of (nop) executes of (nop) #each #each executes empty? executes empty? executes map with constants executes map with constants executes index 1 executes index 1 executes sort with ids executes sort with ids #each_with_index without the index argument builds the correct array builds the correct array without either argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the element argument builds the correct array builds the correct array executes index out of bounds executes index out of bounds executes select executes select executes includes? executes includes? executes sort with strings executes sort with strings creates an array literal with a var creates an array literal with a var assign methods executes target executes target executes value executes value executes assign executes assign macro id methods compares with string compares with string forwards methods to string forwards methods to string compares with symbol compares with symbol Crystal::Asm executes volatile? executes volatile? executes can_throw? executes can_throw? executes text executes text executes clobbers executes clobbers executes outputs executes outputs executes inputs executes inputs executes alignstack? executes alignstack? executes intel? executes intel? Crystal::Select executes else executes else executes whens executes whens splat methods executes exp executes exp Crystal::RangeLiteral executes map executes map #each #each executes excludes_end? executes excludes_end? executes to_a executes to_a executes begin executes begin executes end executes end call methods executes block arg executes block arg executes block executes block executes global? executes global? executes named args value executes named args value executes name executes name executes receiver executes receiver executes named args executes named args executes args executes args executes block arg (nop) executes block arg (nop) executes named args name executes named args name #parse_type 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 union - Union union - Union raises on extra unparsed tokens before the type raises on extra unparsed tokens before the type union - | union - | union - in generic union - in generic raises on empty string raises on empty string path path metaclass metaclass proc proc generic generic exposes syntax warnings exposes syntax warnings block methods executes args executes args executes splat_index executes splat_index executes body executes body unary expression methods executes is_a? executes is_a? executes exp executes exp Crystal::EnumDef executes base_type executes base_type executes kind executes kind executes name executes name executes body executes body regex methods executes options executes options executes source executes source or methods executes left executes left executes right executes right string methods executes [] with incomplete range executes [] with incomplete range executes [] with computed range executes [] with computed range executes empty executes empty executes string ends_with? string (false) executes string ends_with? string (false) executes titleize executes titleize executes lines executes lines executes strip executes strip executes string includes? string (false) executes string includes? string (false) executes string =~ (true) executes string =~ (true) executes upcase executes upcase executes chars executes chars executes string > macroid executes string > macroid executes string > string executes string > string executes string ends_with? string (true) executes string ends_with? string (true) executes string includes? string (true) executes string includes? string (true) executes [] with exclusive range executes [] with exclusive range executes string includes? char (true) executes string includes? char (true) executes [] with inclusive range executes [] with inclusive range executes downcase executes downcase executes to_utf16 executes to_utf16 executes to_i(base) executes to_i(base) executes string != string executes string != string executes camelcase executes camelcase executes underscore executes underscore executes split with char argument executes split with char argument executes to_i executes to_i executes size executes size executes split without arguments executes split without arguments executes string < string executes string < string executes camelcase with invalid lower arg type executes camelcase with invalid lower arg type executes string starts_with? char (true) executes string starts_with? char (true) executes string starts_with? string (true) executes string starts_with? string (true) executes string =~ (false) executes string =~ (false) executes string < macroid executes string < macroid executes string + char executes string + char executes gsub executes gsub executes string chomp executes string chomp executes tr executes tr executes string == string executes string == string executes string starts_with? string (false) executes string starts_with? string (false) executes string + string executes string + string executes string includes? char (false) executes string includes? char (false) executes count executes count executes camelcase with lower executes camelcase with lower executes string ends_with? char (false) executes string ends_with? char (false) executes capitalize executes capitalize executes split with argument executes split with argument executes string starts_with? char (false) executes string starts_with? char (false) executes string ends_with? char (true) executes string ends_with? char (true) compares versions compares versions #warning emits a top level warning emits a top level warning Crystal::ModuleDef executes type_vars executes type_vars executes splat_index executes splat_index executes kind executes kind executes name executes name executes body executes body Crystal::ExternalVar executes real_name executes real_name executes name executes name executes type executes type yield methods executes scope executes scope executes expressions executes expressions executes scope (nop) executes scope (nop) Crystal::TypeDef executes type executes type executes name executes name symbol methods executes symbol == symbol executes symbol == symbol forwards methods to string forwards methods to string executes symbol != symbol executes symbol != symbol exception handler methods executes body executes body executes else executes else executes rescue types executes rescue types executes rescue name executes rescue name executes ensure executes ensure executes else (nop) executes else (nop) executes ensure (nop) executes ensure (nop) executes rescue body executes rescue body executes rescues executes rescues Crystal::Repl::Interpreter classes discards allocate discards allocate interprets read instance var interprets read instance var does constructor does constructor calls implicit struct self method calls implicit struct self method does object_id does object_id calls implicit class self method calls implicit class self method does allocate, set instance var and get instance var does allocate, set instance var and get instance var calls explicit struct self method calls explicit struct self method inlines instance var access from virtual type with a single type (#39520) inlines instance var access from virtual type with a single type (#39520) downcasts virtual type to its only type (#12351) downcasts virtual type to its only type (#12351) Init invocation prints error if a file is already present prints error if a file is already present 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 honors the custom set directory name honors the custom set directory name doesn't error when asked to skip existing files doesn't error when asked to skip existing files produces valid yaml file produces valid yaml file errors if files will be overwritten by a generated file errors if files will be overwritten by a generated file Code gen: if doesn't generate truthy if branch if doesn't need value (bug) doesn't generate truthy if branch if doesn't need value (bug) considers or truthy/falsey right considers or truthy/falsey right codegens bug #1729 codegens bug #1729 codes if with two whiles codes if with two whiles codegen if with union type and else without type codegen if with union type and else without type codegens if with an else with true codegens if with an else with true codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter codegens if with return in else preserves type filter 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 restricts with || always falsey restricts with || always falsey 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 doesn't crash with if !is_a? using var in then doesn't crash with if !is_a? using var in then codegen if inside if codegen if inside if codegens if of nilable type in else codegens if of nilable type in else codegens if of nilable type in else 3 codegens if of nilable type in else 3 codegens if with virtual codegens if with virtual codegens if value from then codegens if value from then codegens if without an else with false codegens if without an else with false doesn't crash no NoReturn var (true left cond) (#1823) doesn't crash no NoReturn var (true left cond) (#1823) codegens if with union codegens if with union 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 codegens if with nil codegens if with nil doesn't crash no NoReturn var (non-true left cond) (#1823) doesn't crash no NoReturn var (non-true left cond) (#1823) doesn't crash with if !var using var in else doesn't crash with if !var using var in else codegens if without an else with true codegens if without an else with true codegens if with int codegens if with int codegens if with return in both branches codegens if with return in both branches codegens nested if with var (ssa bug) codegens nested if with var (ssa bug) codegens if with pointer 0x100000000 pointer codegens if with pointer 0x100000000 pointer codegens if with return and no else codegens if with return and no else codegens if with an else with false codegens if with an else with false codegen if with union type and then without type codegen if with union type and then without type codegens #3104 codegens #3104 read_file with absolute path reads file (exists) reads file (exists) reads file (doesn't exist) reads file (doesn't exist) with relative path reads file (exists) reads file (exists) reads file (doesn't exist) reads file (doesn't exist) Semantic: extern struct errors if using non-primitive for field type via module errors if using non-primitive for field type via module can new with named args can new with named args errors if using non-primitive for field type errors if using non-primitive for field type overrides getter overrides getter declares extern union with no constructor declares extern union with no constructor declares extern struct with no constructor declares extern struct with no constructor errors if using non-primitive type in constructor errors if using non-primitive type in constructor can use extern struct in lib can use extern struct in lib can include module can include module can be passed to C fun can be passed to C fun declares with constructor declares with constructor Code gen: macro expands macro with default arg and splat (3) (#784) expands macro with default arg and splat (3) (#784) codegens macro def with default arg (similar to #496) codegens macro def with default arg (similar to #496) gets default value of instance variable of inherited type that also includes module gets default value of instance variable of inherited type that also includes module can access type variables of a generic type can access type variables of a generic type 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 determines if overrides (true) determines if overrides (true) executes subclasses executes subclasses allows overriding macro definition when redefining base class allows overriding macro definition when redefining base class expands macro that yields expands macro that yields 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 keeps line number with a block keeps line number with a block surrounds {{yield}} with begin/end surrounds {{yield}} with begin/end can access type variables of a tuple can access type variables of a tuple keeps line number with no block keeps line number with no block 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 says that enum doesn't have Flags annotation says that enum doesn't have Flags annotation can refer to abstract (1) can refer to abstract (1) expands macro defined in base class expands macro defined in base class errors if dynamic constant assignment after macro expansion errors if dynamic constant assignment after macro expansion expands macro expands macro expands macro defined in class expands macro defined in class can refer to union (2) can refer to union (2) expands macro with default arg and splat (2) (#784) expands macro with default arg and splat (2) (#784) expands @def in inline macro expands @def in inline macro expands @type.name in virtual metaclass (1) expands @type.name in virtual metaclass (1) expands def macro with instance var and method call (bug) expands def macro with instance var and method call (bug) expands macro that invokes another macro expands macro that invokes another macro doesn't replace %q() (#2178) doesn't replace %q() (#2178) devirtualizes @type devirtualizes @type codegens macro with comment (bug) (#1396) codegens macro with comment (bug) (#1396) can refer to abstract (2) can refer to abstract (2) allows macro with default arguments allows macro with default arguments determines if overrides, through module (true) determines if overrides, through module (true) expands inline macro expands inline macro determines if overrides, through another class (true) determines if overrides, through another class (true) expands inline macro for expands inline macro for runs macro with arg and splat runs macro with arg and splat resolves alias in macro resolves alias in macro 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) runs macro with splat runs macro with splat responds correctly to has_constant? with @top_level responds correctly to has_constant? with @top_level can use constants can use constants keeps heredoc contents inside macro keeps heredoc contents inside macro expands def macro with @type.name expands def macro with @type.name says that enum has Flags annotation says that enum has Flags annotation determines if overrides (false) determines if overrides (false) gets enum members with @type.constants gets enum members with @type.constants correctly recomputes call (bug) correctly recomputes call (bug) does block unpacking inside macro expression (#13707) does block unpacking inside macro expression (#13707) expands macro as class method expands macro as class method expands def macro with @type.name with virtual expands def macro with @type.name with virtual expands inline macro if (true) expands inline macro if (true) passes #826 passes #826 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 finds macro in class finds macro in class can access type variables can access type variables retains original yield expression (#2923) retains original yield expression (#2923) expands def macro with @type.instance_vars with subclass expands def macro with @type.instance_vars with subclass checks if macro expansion returns (#821) checks if macro expansion returns (#821) expands def macro expands def macro doesn't reuse macro nodes (bug) doesn't reuse macro nodes (bug) executes with named arguments for positional arg (2) executes with named arguments for positional arg (2) expands inline macro if (false) expands inline macro if (false) can refer to types can refer to types gets default value of instance variable gets default value of instance variable gets methods gets methods determines if method exists (false) determines if method exists (false) determines if method exists (true) determines if method exists (true) can access type variables that are not types can access type variables that are not types executes all_subclasses executes all_subclasses doesn't skip abstract classes when defining macro methods doesn't skip abstract classes when defining macro methods expands def macro with var expands def macro with var can access free variables can access free variables expands macro with arguments expands macro with arguments initializes class var in macro initializes class var in macro expands macro and resolves type correctly expands macro and resolves type correctly codegens macro def with splat (#496) codegens macro def with splat (#496) 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 def macro with @type.instance_vars with virtual expands def macro with @type.instance_vars with virtual expands def macro with @type.instance_vars expands def macro with @type.instance_vars fixes empty types of macro expansions (#1379) fixes empty types of macro expansions (#1379) uses tuple T in method with free vars uses tuple T in method with free vars can refer to union (1) can refer to union (1) 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) executes with named arguments executes with named arguments uses indexed macro variable with many keys uses indexed macro variable with many keys expands macro with escaped quotes (#895) expands macro with escaped quotes (#895) forwards line number forwards line number declares constant in macro (#838) declares constant in macro (#838) gets constant gets constant access to the program with @top_level access to the program with @top_level gets enum members as constants gets enum members as constants expands def macro with @type.name with virtual (2) expands def macro with @type.name with virtual (2) gets correct class name when there are classes in the middle gets correct class name when there are classes in the middle can iterate union types can iterate union types expands macro with default arg and splat (#784) expands macro with default arg and splat (#784) expands @type.name in virtual metaclass (2) expands @type.name in virtual metaclass (2) forwards file location forwards file location stringifies type without virtual marker stringifies type without virtual marker accepts compile-time flags accepts compile-time flags determines if variable has default value determines if variable has default value 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 can access type variables of a module can access type variables of a module initializes instance var in macro initializes instance var in macro uses invocation context uses invocation context 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) doesn't override local variable when using macro variable (2) doesn't override local variable when using macro variable (2) doesn't replace %s in string (#2178) doesn't replace %s in string (#2178) expands macro as class method and accesses @type expands macro as class method and accesses @type implicitly marks method as macro def when using @type implicitly marks method as macro def when using @type types macro expansion bug (#1734) types macro expansion bug (#1734) determines if overrides, with macro method (false) determines if overrides, with macro method (false) doesn't override local variable when using macro variable doesn't override local variable when using macro variable expands @def in macro expands @def in macro expands macro def with return (#1040) expands macro def with return (#1040) executes with named arguments for positional arg (1) executes with named arguments for positional arg (1) correctly resolves constant inside block in macro def correctly resolves constant inside block in macro def forwards dir location forwards dir location finds macro from virtual type finds macro from virtual type transforms hooks (bug) transforms hooks (bug) expands Path with resolve method expands Path with resolve method uses indexed macro variable uses indexed macro variable receives &block receives &block can refer to @type can refer to @type executes with named arguments for positional arg (3) executes with named arguments for positional arg (3) immutability of returned container literals (#10818) MultiAssign#targets MultiAssign#targets ProcPointer#args ProcPointer#args Union#types Union#types Annotation#args Annotation#args When#conds When#conds MultiAssign#values MultiAssign#values Generic#type_vars Generic#type_vars StringInterpolation#expressions StringInterpolation#expressions ProcNotation#inputs ProcNotation#inputs Call errors says type mismatch for positional argument with three options says type mismatch for positional argument with three options 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 says wrong number of arguments (to few arguments) says wrong number of arguments (to few arguments) says not expected to be invoked with a block says not expected to be invoked with a block 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 replaces generic type var in positional argument replaces generic type var in positional argument says type mismatch for symbol against enum (did you mean) says type mismatch for symbol against enum (did you mean) says no parameter named says no parameter named says argument already specified says argument already specified 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 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 no parameters named says no parameters named errors on argument if more types are given than expected errors on argument if more types are given than expected says missing named arguments says missing named arguments says type mismatch for positional argument with two options says type mismatch for positional argument with two options replaces free variables in positional argument replaces free variables in positional argument method signatures in error traces expands positional and single splat argument, more elements expands positional and single splat argument, more elements expands positional and double splat argument, empty named tuple expands positional and double splat argument, empty named tuple uses `T.method` instead of `T.class#method` uses `T.method` instead of `T.class#method` expands positional and double splat argument expands positional and double splat argument expands single splat argument, more elements expands single splat argument, more elements 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 expands positional and single splat argument uses `T.method` instead of `T:module#method` uses `T.method` instead of `T:module#method` expands single splat argument, empty tuple expands single splat argument, empty tuple expands double splat argument, empty named tuple expands double splat argument, empty named tuple includes named argument includes named argument expands positional and single splat argument, empty tuple expands positional and single splat argument, empty tuple expands double splat argument, more elements expands double splat argument, more elements expands single splat argument expands single splat argument includes positional and named argument includes positional and named argument expands double splat argument expands double splat argument says expected to be invoked with a block says expected to be invoked with a block says missing named argument says missing named argument replaces free variables in named argument replaces free variables in named argument says type mismatch for named argument says type mismatch for named argument replaces generic type var in named argument replaces generic type var in named argument 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 type mismatch for positional argument says type mismatch for positional argument Code gen: offsetof returns offset allowing manual access of tuple items returns offset allowing manual access of tuple items returns offset of extern union returns offset of extern union returns offset allowing manual access of first struct field returns offset allowing manual access of first struct 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` 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 Crystal::Repl::Interpreter autocast autocasts integer var to integer (#12560) autocasts integer var to integer (#12560) autocasts number literal to float autocasts number literal to float autocasts symbol to enum in ivar initializer (#12216) autocasts symbol to enum in ivar initializer (#12216) autocasts symbol to enum autocasts symbol to enum autocasts integer var to float (#12560) autocasts integer var to float (#12560) autocasts float32 var to float64 (#12560) autocasts float32 var to float64 (#12560) autocasts number literal to integer autocasts number literal to integer autocasts symbol to enum in multidispatch (#11782) autocasts symbol to enum in multidispatch (#11782) autocasts int in multidispatch autocasts int in multidispatch Semantic: NoReturn computes NoReturn in a lazy way inside if then (#314) (3) computes NoReturn in a lazy way inside if then (#314) (3) types with no return even if code follows types with no return even if code follows computes NoReturn in a lazy way inside if else (#314) (1) computes NoReturn in a lazy way inside if else (#314) (1) types union of NoReturn and something else types union of NoReturn and something else computes NoReturn in a lazy way inside if else (#314) (5) computes NoReturn in a lazy way inside if else (#314) (5) computes NoReturn in a lazy way inside if then (#314) (1) computes NoReturn in a lazy way inside if then (#314) (1) types as NoReturn if typeof(exp)'s exp is NoReturn types as NoReturn if typeof(exp)'s exp is NoReturn assumes if condition's type filters when else is no return assumes if condition's type filters when else is no return computes NoReturn in a lazy way inside if else (#314) (2) computes NoReturn in a lazy way inside if else (#314) (2) types union of NoReturns types union of NoReturns computes NoReturn in a lazy way inside if else (#314) (4) computes NoReturn in a lazy way inside if else (#314) (4) computes NoReturn in a lazy way inside if else (#314) (3) computes NoReturn in a lazy way inside if else (#314) (3) computes NoReturn in a lazy way inside if then (#314) (5) computes NoReturn in a lazy way inside if then (#314) (5) computes NoReturn in a lazy way inside if then (#314) (4) computes NoReturn in a lazy way inside if then (#314) (4) types raise as NoReturn types raise as NoReturn types exception handler as NoReturn if ensure is NoReturn types exception handler as NoReturn if ensure is NoReturn types call to LibC.exit as NoReturn types call to LibC.exit as NoReturn types as NoReturn even if Nil return type is forced (#3096) types as NoReturn even if Nil return type is forced (#3096) computes NoReturn in a lazy way inside if then (#314) (2) computes NoReturn in a lazy way inside if then (#314) (2) Code gen: struct codegens virtual struct codegens virtual struct codegens virtual structs union (1) codegens virtual structs union (1) creates struct in def creates struct in def codegens virtual structs union (2) codegens virtual structs union (2) codegens virtual struct metaclass (#2551) (2) codegens virtual struct metaclass (#2551) (2) 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 (1) assigning a struct makes a copy (1) casts virtual struct to base type, only one subclass (#2885) casts virtual struct to base type, only one subclass (#2885) codegens virtual struct with pointer codegens virtual struct with pointer codegens virtual struct metaclass (#2551) (3) codegens virtual struct metaclass (#2551) (3) returns self returns self 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 returns self with block returns self with block mutates a virtual struct mutates a virtual struct codegens virtual struct metaclass (#2551) (1) codegens virtual struct metaclass (#2551) (1) allows assigning to struct argument (bug) allows assigning to struct argument (bug) 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 assigning a struct makes a copy (2) assigning a struct makes a copy (2) passes a generic struct as a parameter makes a copy passes a generic struct as a parameter makes a copy 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 can call new on abstract struct with single child (#7309) can call new on abstract struct with single child (#7309) passes a struct as a parameter makes a copy passes a struct as a parameter makes a copy returns struct as a copy returns struct as a copy codegens struct assigned to underscore (#1842) codegens struct assigned to underscore (#1842) creates structs creates structs creates structs with instance var creates structs with instance var does phi of struct does phi of struct uses nilable struct uses nilable struct Semantic: yield with scope infer type of block body infer type of block body uses method of enclosing scope uses method of enclosing scope infer type of empty block body infer type of empty block body mentions with yield scope and current scope in error mentions with yield scope and current scope in error infer type of block body with yield scope infer type of block body with yield scope infer type of block body with yield scope and arguments infer type of block body with yield scope and arguments passes #229 passes #229 invokes nested calls invokes nested calls uses instance variable of enclosing scope uses instance variable of enclosing scope finds macro finds macro errors if using instance variable at top level errors if using instance variable at top level Semantic: special vars infers $? infers $? errors if assigning $? at top level errors if assigning $? at top level errors if assigning $~ at top level errors if assigning $~ at top level infers in block infers in block infers $~ infers $~ types $~ when not defined as no return (2) types $~ when not defined as no return (2) infers in block with nested block infers in block with nested block infers when assigning inside block infers when assigning inside block infers after block infers after block types $? when not defined as no return types $? when not defined as no return types $~ when not defined as no return types $~ when not defined as no return types $? when not defined as no return (2) types $? when not defined as no return (2) Semantic: doc stores doc for flags enum with base type stores doc for flags enum with base type stores doc for module stores doc for module stores doc for constant stores doc for constant overwrites doc for struct when reopening overwrites doc for struct when reopening stores doc for macro defined in macro call stores doc for macro defined in macro call stores doc for enum with @[Flags] stores doc for enum with @[Flags] stores doc for enum member stores doc for enum member attaches doc in double macro expansion (#8463) attaches doc in double macro expansion (#8463) stores doc for def stores doc for def stores doc for fun def stores doc for fun def stores doc for nodes defined in macro call (2) stores doc for nodes defined in macro call (2) stores doc for enum and doesn't mix with value stores doc for enum and doesn't mix with value stores doc for abstract def stores doc for abstract def stores doc for nodes defined in macro call stores doc for nodes defined in macro call stores location for implicit flag enum members stores location for implicit flag enum members stores doc for macro stores doc for macro stores doc for module when reopening stores doc for module when reopening overwrites doc for enum when reopening overwrites doc for enum when reopening stores doc for def with annotation stores doc for def with annotation stores doc for struct stores doc for struct stores doc for class when reopening stores doc for class when reopening stores doc for def with visibility stores doc for def with visibility overwrites doc for module when reopening overwrites doc for module when reopening overwrites doc for def when redefining overwrites doc for def when redefining stores doc for class stores doc for class stores doc for def with annotation stores doc for def with annotation stores doc for alias stores doc for alias stores doc for struct when reopening stores doc for struct when reopening stores doc for enum when reopening stores doc for enum when reopening attaches doc to annotation in macro expansion (#9628) attaches doc to annotation in macro expansion (#9628) stores doc for enum stores doc for enum stores locations for auto-generated module stores locations for auto-generated module overwrites doc for macro when redefining overwrites doc for macro when redefining overwrites doc for class when reopening overwrites doc for class when reopening doc before annotation attached to macro attached to macro attached to alias attached to alias attached to module attached to module attached to constant attached to constant attached to macro call attached to macro call attached to def attached to def attached to macro call that produces multiple types attached to macro call that produces multiple types attached to struct/class attached to struct/class attached to enum attached to enum :ditto: stores doc for macro stores doc for macro amend previous doc amend previous doc stores doc for def stores doc for def :ditto: references last non-ditto doc :ditto: references last non-ditto doc amend previous doc (without empty line) amend previous doc (without empty line) stores doc for const stores doc for const stores doc for abstract class stores doc for abstract class Crystal::Repl::Interpreter magic constants does line number does line number constants hoists constants hoists constants interprets self inside constant inside class interprets self inside constant inside class interprets complex constant interprets complex constant interprets constant literal interprets constant literal returns nil in the assignment returns nil in the assignment Crystal::Repl::Interpreter is_a? does is_a? from NilableReferenceUnionType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableType to NonGenericClassType (true) does is_a? from NilableType to NonGenericClassType (true) does is_a? from NilableProcType to Nil does is_a? from NilableProcType to Nil does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from VirtualType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (true) 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 NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (false) does is_a? from VirtualType to NonGenericClassType (false) Semantic: new errors if using self call in default argument (3) errors if using self call in default argument (3) uses correct receiver for `initialize` in namespaced generic classes (#4086) uses correct receiver for `initialize` in namespaced generic classes (#4086) evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) doesn't incorrectly redefines new for generic class doesn't incorrectly redefines new for generic class inherits initialize and new methods if doesn't define new (#3238) inherits initialize and new methods if doesn't define new (#3238) errors if using self call in default argument (2) errors if using self call in default argument (2) doesn't have default new for inherited class from generic type doesn't have default new for inherited class from generic type evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) 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 (6) (#731) evaluates initialize default value at the instance scope (6) (#731) evaluates initialize default value at the instance scope (5) (#731) evaluates initialize default value at the instance scope (5) (#731) read_file? with relative path reads file (doesn't exist) reads file (doesn't exist) with absolute path reads file (doesn't exist) reads file (doesn't exist) Crystal::Repl::Interpreter sizeof interprets sizeof typeof interprets sizeof typeof instance_sizeof interprets instance_sizeof typeof interprets instance_sizeof typeof alignof interprets alignof typeof interprets alignof typeof instance_alignof interprets instance_alignof typeof interprets instance_alignof typeof .system successful command with output successful command with output sh: 1: commanddoesnotexist: not found command does not exist command does not exist failing command failing command successful command successful command Normalize: case normalizes select with assign and bang method normalizes select with assign and bang method normalizes select with assign normalizes select with assign normalizes select with assign and question method normalizes select with assign and question method normalizes select with else normalizes select with else normalizes select with call normalizes select with call Crystal::Repl::Interpreter casts casts from nilable type to mixed union type (2) casts from nilable type to mixed union type (2) does as? with no resulting type, not from nil (#12327) does as? with no resulting type, not from nil (#12327) raises when as fails raises when as fails 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) does as? with no resulting type (#12327) does as? with no resulting type (#12327) upcasts between named tuple types, same order upcasts between named tuple types, same order casts from mixed union type to primitive type casts from mixed union type to primitive type upcasts between tuple types upcasts between tuple types upcasts in nilable cast (#12532) upcasts in nilable cast (#12532) puts tuple type inside union of different tuple type (#12243) puts tuple type inside union of different tuple type (#12243) discards cast discards cast casts to filtered type, not type in as(...) casts to filtered type, not type in as(...) does is_a? with virtual type (struct) does is_a? with virtual type (struct) casts from reference to pointer and back casts from reference to pointer and back does as? with a type that can't match (#12346) does as? with a type that can't match (#12346) upcasts virtual type to union upcasts virtual type to union casts nilable from mixed union type to primitive type (non-nil case) casts nilable from mixed union type to primitive type (non-nil case) upcasts GenericClassInstanceMetaclassType to VirtualMetaclassType upcasts GenericClassInstanceMetaclassType to VirtualMetaclassType casts from mixed union type to another mixed union type for caller casts from mixed union type to another mixed union type for caller does is_a? with virtual metaclass does is_a? with virtual metaclass 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 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) casts nilable from mixed union type to primitive type (nil case) casts nilable from mixed union type to primitive type (nil case) casts from mixed union type to nilable proc type (#12283) casts from mixed union type to nilable proc type (#12283) puts named tuple type inside union of different named tuple type (#12243) puts named tuple type inside union of different named tuple type (#12243) puts virtual metaclass into union (#12162) puts virtual metaclass into union (#12162) upcasts between tuple types, respects alignment (#14036) upcasts between tuple types, respects alignment (#14036) upcasts to module type upcasts to module type casts nil to Void* casts nil to Void* upcasts between named tuple types, different order upcasts between named tuple types, different order 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) Normalize: multi assign normalizes n to splat on left-hand side normalizes n to splat on left-hand side strict_multi_assign normalizes 1 to n with call normalizes 1 to n with call normalizes 1 to n with [] normalizes 1 to n with [] normalizes 1 to n normalizes 1 to n normalizes n to n normalizes n to n normalizes 1 to splat on left-hand side normalizes 1 to splat on left-hand side normalizes 1 to n, with *_ on left-hand side (1) normalizes 1 to n, with *_ on left-hand side (1) without strict_multi_assign normalizes 1 to n with call normalizes 1 to n with call normalizes 1 to n normalizes 1 to n normalizes 1 to n with [] normalizes 1 to n with [] 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 n, with *_ on left-hand side (3) normalizes 1 to n, with *_ on left-hand side (3) normalizes m to n, with splat on left-hand side, splat is non-empty normalizes m to n, with splat on left-hand side, splat is non-empty normalizes n to n with [] normalizes n to n with [] 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 1 to *_ on left-hand side normalizes 1 to *_ on left-hand side normalizes m to n, with *_ on left-hand side (3) normalizes m to n, with *_ on left-hand side (3) 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 normalizes 1 to n, with splat on left-hand side normalizes n to n with call normalizes n to n with call normalizes 1 to n, with *_ on left-hand side (2) normalizes 1 to n, with *_ on left-hand side (2) normalizes n to *_ on left-hand side normalizes n to *_ on left-hand side normalizes m to n, with *_ on left-hand side (2) normalizes m to n, with *_ on left-hand side (2) Semantic: fun errors if defining class inside fun through macro (#6874) errors if defining class inside fun through macro (#6874) Normalize: block normalizes unpacking with single expression body normalizes unpacking with single expression body normalizes nested unpacking normalizes nested unpacking normalizes unpacking with empty body normalizes unpacking with empty body normalizes unpacking with multiple body expressions normalizes unpacking with multiple body expressions normalizes multiple nested unpackings normalizes multiple nested unpackings normalizes unpacking with splat normalizes unpacking with splat normalizes unpacking with underscore normalizes unpacking with underscore Semantic: var errors if reads from underscore errors if reads from underscore reports there's no self reports there's no self reports undefined local variable or method reports undefined local variable or method types an assign types an assign declares local variable and then assigns it declares local variable and then assigns it errors if declaring generic type without type vars (with local var) errors if declaring generic type without type vars (with local var) errors if variable already exists errors if variable already exists types a variable types a variable declares local variable but doesn't assign it in all branches declares local variable but doesn't assign it in all branches declares local variable with value declares local variable with value declares local variable and immediately reads it declares local variable and immediately reads it reports variable always nil reports variable always nil 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 declares local variable and assigns wrong type declares local variable and assigns wrong type types an assign with type declaration types an assign with type declaration errors if declaring var that is already declared errors if declaring var that is already declared lets type on else side of if with a Bool | Nil union lets type on else side of if with a Bool | Nil union declares local variable and assigns it with if declares local variable and assigns it with if Semantic: class errors if reopening generic class with different splat index errors if reopening generic class with different splat index can't reopen as struct can't reopen as struct doesn't lookup type in parents' namespaces, and lookups and in program doesn't lookup type in parents' namespaces, and lookups and in program doesn't mark instance variable as nilable if calling another initialize doesn't mark instance variable as nilable if calling another initialize can mark initialize as private can mark initialize as private types type var union types type var union reports undefined method when method inside a class reports undefined method when method inside a class errors if reopening non-generic class as generic errors if reopening non-generic class as generic does automatic type inference of new for nested generic type does automatic type inference of new for nested generic type inherits self (#2890) inherits self (#2890) hoists instance variable initializer hoists instance variable initializer can invoke method on abstract generic type without subclasses nor instances can invoke method on abstract generic type without subclasses nor instances inherits self twice (#5495) inherits self twice (#5495) errors if inherits from metaclass errors if inherits from metaclass errors when creating Number errors when creating Number types self inside method call without obj types self inside method call without obj types class and subclass as one type types class and subclass as one type correctly types #680 (2) correctly types #680 (2) errors if reading non-existent ivar errors if reading non-existent ivar errors if using read-instance-var with non-typed variable errors if using read-instance-var with non-typed variable errors if declares class inside if errors if declares class inside if doesn't error on new on abstract virtual type class doesn't error on new on abstract virtual type class uses self as type var uses self as type var reports can't instantiate abstract class on allocate reports can't instantiate abstract class on allocate errors if assigning superclass to declared instance var errors if assigning superclass to declared instance var types recursive type types recursive type types instance variable types instance variable reports undefined instance method reports undefined instance method type def does not reopen type from parent namespace (#11181) type def does not reopen type from parent namespace (#11181) errors when wrong arguments for new errors when wrong arguments for new does automatic type inference of new for generic types 2 does automatic type inference of new for generic types 2 reads a virtual type instance var reads a virtual type instance var can't reopen as module can't reopen as module can use short name for top-level type can use short name for top-level type types bug #168 (it inherits instance var even if not mentioned in initialize) types bug #168 (it inherits instance var even if not mentioned in initialize) says no overload matches for class new says no overload matches for class new doesn't mix classes on definition (#2352) doesn't mix classes on definition (#2352) types Const#allocate types Const#allocate errors if reopening generic class with different type vars errors if reopening generic class with different type vars errors if creating instance before typing instance variable errors if creating instance before typing instance variable can invoke method on abstract generic type with subclasses but no instances can invoke method on abstract generic type with subclasses but no instances allows instantiating generic class with number allows instantiating generic class with number types class and subclass as one type types class and subclass as one type allows declaring a variable in an initialize and using it allows declaring a variable in an initialize and using it uses number type var in class method uses number type var in class method types Const#new#method types Const#new#method doesn't use initialize from base class with virtual type doesn't use initialize from base class with virtual type can invoke method on abstract type without subclasses nor instances can invoke method on abstract type without subclasses nor instances correctly types #680 correctly types #680 errors when creating Value errors when creating Value errors if using underscore in generic class errors if using underscore in generic class reports unknown class when extending reports unknown class when extending reads an object instance var reads an object instance var infers generic type after instance was created with explicit type infers generic type after instance was created with explicit type allows defining classes inside modules or classes with :: allows defining classes inside modules or classes with :: types as no return if calling method on abstract class with all abstract subclasses (#6996) types as no return if calling method on abstract class with all abstract subclasses (#6996) says wrong number of arguments for abstract class new says wrong number of arguments for abstract class new doesn't use initialize from base class doesn't use initialize from base class doesn't lookup new in supermetaclass doesn't lookup new in supermetaclass errors on no method found on abstract class, class method (#2241) errors on no method found on abstract class, class method (#2241) reports can't instantiate abstract class on new reports can't instantiate abstract class on new inherits Gen(self) (#2890) inherits Gen(self) (#2890) says wrong number of arguments for abstract class new (2) says wrong number of arguments for abstract class new (2) reports uninitialized constant reports uninitialized constant doesn't crash with top-level initialize (#2601) doesn't crash with top-level initialize (#2601) types instance variable types instance variable errors if reopening generic class with different splat index (3) errors if reopening generic class with different splat index (3) reads an object instance var from a union type reads an object instance var from a union type errors if reading ivar from non-ivar container errors if reading ivar from non-ivar container can't use implicit initialize if defined in parent can't use implicit initialize if defined in parent types as no return if calling method on abstract generic class (#6996) types as no return if calling method on abstract generic class (#6996) doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) errors if inherits from module errors if inherits from module does automatic inference of new for generic types does automatic inference of new for generic types says that instance vars are not allowed in metaclass says that instance vars are not allowed in metaclass types Const#new types Const#new types virtual method of generic class types virtual method of generic class types as no return if calling method on abstract class with generic subclasses but no instances (#6996) types as no return if calling method on abstract class with generic subclasses but no instances (#6996) errors if reopening generic class with different type vars (2) errors if reopening generic class with different type vars (2) reports wrong number of arguments for initialize reports wrong number of arguments for initialize errors if reopening generic class with different splat index (2) errors if reopening generic class with different splat index (2) reports superclass mismatch reports superclass mismatch uses self as type var uses self as type var types instance variable on getter types instance variable on getter types class inside class types class inside class types generic of generic type types generic of generic type preserves order of instance vars (#3050) preserves order of instance vars (#3050) allows using self in class scope allows using self in class scope types class and subclass as one type types class and subclass as one type types as no return if calling method on generic class with subclasses (#6996) types as no return if calling method on generic class with subclasses (#6996) errors if inheriting Gen(self) and there's no self (#2890) errors if inheriting Gen(self) and there's no self (#2890) finds in global scope if includes module finds in global scope if includes module Normalize: proc pointer normalizes proc pointer with parameters, without object normalizes proc pointer with parameters, without object normalizes proc pointer with cvar receiver normalizes proc pointer with cvar receiver normalizes proc pointer with ivar receiver normalizes proc pointer with ivar receiver normalizes proc pointer with const receiver normalizes proc pointer with const receiver normalizes proc pointer without object normalizes proc pointer without object normalizes proc pointer with global const receiver normalizes proc pointer with global const receiver normalizes proc pointer of global call normalizes proc pointer of global call normalizes proc pointer with variable receiver normalizes proc pointer with variable receiver Semantic: type can call methods of parent type can call methods of parent type errors if original type doesn't support instance variables errors if original type doesn't support instance variables can call methods of original type can call methods of original type can access instance variables of original type can access instance variables of original type Normalize: case normalizes case with Generic.class to is_a? normalizes case with Generic.class to is_a? normalizes case with multiple expressions normalizes case with multiple expressions normalizes case with multiple expressions with all underscores normalizes case with multiple expressions with all underscores normalizes case with nil to is_a? normalizes case with nil to is_a? normalizes case with assignment normalizes case with assignment normalizes case with assignment wrapped by paren normalizes case with assignment wrapped by paren normalizes case with implicit as? (#3040) normalizes case with implicit as? (#3040) normalizes case with implicit is_a? (#3040) normalizes case with implicit is_a? (#3040) normalizes case with Path.class to is_a? (in) normalizes case with Path.class to is_a? (in) normalizes case with implicit ! normalizes case with implicit ! normalizes case without cond, when and else normalizes case without cond, when and else normalizes case with var in cond normalizes case with var in cond normalizes case with multiple expressions with underscore normalizes case with multiple expressions with underscore 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 multiple expressions with all underscores twice normalizes case with multiple expressions with all underscores twice normalizes case with many expressions in when normalizes case with many expressions in when normalizes case with implicit responds_to? (#3040) normalizes case with implicit responds_to? (#3040) normalizes case with generic to is_a? normalizes case with generic to is_a? normalizes case with multiple expressions and comma normalizes case with multiple expressions and comma normalizes case with call normalizes case with call normalizes case without when but else normalizes case without when but else normalizes case with Path to is_a? normalizes case with Path to is_a? normalizes case without value normalizes case without value normalizes case with multiple expressions and implicit obj normalizes case with multiple expressions and implicit obj normalizes case without value with many expressions in when normalizes case without value with many expressions in when normalizes case with implicit call normalizes case with implicit call normalizes case without cond, when but else normalizes case without cond, when but else normalizes case without when and else normalizes case without when and else normalizes case with multiple expressions and non-tuple normalizes case with multiple expressions and non-tuple normalizes case with multiple expressions and types normalizes case with multiple expressions and types Crystal::Doc::Generator .anchor_link generates the correct anchor link generates the correct anchor link Visibility modifiers allows invoking protected method from namespaced type to namespace allows invoking protected method from namespaced type to namespace allows invoking private setter with self allows invoking private setter with self allows invoking protected method between types in the same namespace allows invoking protected method between types in the same namespace allows calling protected method from nested generic class (2) allows calling protected method from nested generic class (2) allows invoking protected method from subclass (2) allows invoking protected method from subclass (2) errors if invoking protected method from non-subclass errors if invoking protected method from non-subclass allows setting visibility modifier to macro that generates many methods (1) allows setting visibility modifier to macro that generates many methods (1) errors if applying visibility modifier to non-def or non-call errors if applying visibility modifier to non-def or non-call allows invoking protected method between types in the same namespace when inheriting allows invoking protected method between types in the same namespace when inheriting defines protected initialize (#7501) defines protected initialize (#7501) automatically makes initialize be protected automatically makes initialize be protected allows invoking protected method from namespace to namespaced type allows invoking protected method from namespace to namespaced type allows invoking protected method from virtual type allows invoking protected method from virtual type errors if invoking protected method from top-level errors if invoking protected method from top-level allows setting visibility modifier to macro allows setting visibility modifier to macro allows invoking protected method from subclass allows invoking protected method from subclass allows invoking private method from the same class allows invoking private method from the same class allows setting visibility modifier to macro that generates many methods (2) allows setting visibility modifier to macro that generates many methods (2) handles virtual types (#8561) handles virtual types (#8561) gives correct error on unknown call (#2838) gives correct error on unknown call (#2838) disallows invoking private method disallows invoking private method allows invoking protected from instance to class allows invoking protected from instance to class errors if invoking protected method from non-subclass, generated with macro that generates a macro errors if invoking protected method from non-subclass, generated with macro that generates a macro allows calling protected method from nested generic class (1) allows calling protected method from nested generic class (1) allows invoking protected method from the same class allows invoking protected method from the same class Crystal::Loader .parse parses file paths parses file paths parses library names parses library names parses directory paths parses directory paths parses static parses static prepends directory paths before default search paths prepends directory paths before default search paths .read_ld_conf with include with include basic basic dynlib validate that lib handles are properly closed validate that lib handles are properly closed #load_library? full path full path library name library name lookup in order lookup in order does not implicitly find dependencies does not implicitly find dependencies does not find global symbols does not find global symbols #load_file? finds function symbol finds function symbol .default_search_paths LD_LIBRARY_PATH LD_LIBRARY_PATH DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH Codegen: while codegens while with false codegens while with false codegens while with declared var 1 codegens while with declared var 1 codegens while with non-false condition codegens while with non-false condition doesn't crash on #2767 (2) doesn't crash on #2767 (2) doesn't crash on #2767 doesn't crash on #2767 break with value, condition fails break with value, condition fails conditional break with value conditional break with value endless conditional break with value endless conditional break with value doesn't crash on #2767 (4) doesn't crash on #2767 (4) codegens def with while codegens def with while doesn't crash on while true begin break rescue (#7786) doesn't crash on while true begin break rescue (#7786) doesn't crash on #2767 (3) doesn't crash on #2767 (3) conditional break without value conditional break without value break without value break without value break with value break with value codegens while with declared var 2 codegens while with declared var 2 endless break with value endless break with value codegens while with declared var 3 codegens while with declared var 3 skip block with next skip block with next codegens endless while codegens endless while doesn't crash on a = NoReturn doesn't crash on a = NoReturn Semantic: array assignment in array literal works (#3195) assignment in array literal works (#3195) types array literal with splats types array literal with splats types non-empty typed array literal of int types non-empty typed array literal of int types array literal of int types array literal of int types empty typed array literal of int32 types empty typed array literal of int32 types array literal with splats (2) types array literal with splats (2) types array literal size correctly types array literal size correctly types non-empty typed array literal of int types non-empty typed array literal of int types array literal of int with splats types array literal of int with splats types array literal of union types array literal of union Code gen: 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 casts to recursive alias codegens cast to alias that includes bool codegens cast to alias that includes bool 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) lazily solves aliases (#1346) lazily solves aliases (#1346) casts to recursive alias casts to recursive alias overloads alias against generic (2) (#3261) overloads alias against generic (2) (#3261) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (2) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) invokes methods on empty array of recursive alias (1) overloads alias against generic (1) (#3261) overloads alias against generic (1) (#3261) doesn't break with alias for link attributes doesn't break with alias for link attributes Crystal::Repl::Interpreter responds_to? does responds_to? does responds_to? doesn't crash if def body ends up with no type (#12219) doesn't crash if def body ends up with no type (#12219) Code gen: magic constants does __LINE__ in macro does __LINE__ in macro does __END_LINE__ with block does __END_LINE__ with block does __LINE__ when specifying one middle argument does __LINE__ when specifying one middle argument does __DIR__ does __DIR__ does __LINE__ with dispatch does __LINE__ with dispatch does __FILE__ does __FILE__ does __FILE__ in macro does __FILE__ in macro does __END_LINE__ without block does __END_LINE__ without block does __LINE__ does __LINE__ does __LINE__ when specifying one default arg with __FILE__ does __LINE__ when specifying one default arg with __FILE__ does __END_LINE__ in macro with block does __END_LINE__ in macro with block does __DIR__ in macro does __DIR__ in macro does __LINE__ when specifying one normal default arg does __LINE__ when specifying one normal default arg does __END_LINE__ in macro without block does __END_LINE__ in macro without block Code gen: struct builds struct setter with fun type (2) builds struct setter with fun type (2) allows using named arguments for new allows using named arguments for new codegens struct set inside struct codegens struct set inside struct codegens assign struct to union codegens assign struct to union automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe passes struct to method (2) passes struct to method (2) passes struct to method (1) passes struct to method (1) 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 union type in struct field assignment automatically converts numeric union type in struct field assignment codegens struct property setter via pointer codegens struct property setter via pointer codegens struct property setter codegens struct property setter yields struct via -> yields struct via -> automatically converts nil to pointer automatically converts nil to pointer codegens struct get inside struct codegens struct get 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 codegens passing pointerof(struct) to fun codegens passing pointerof(struct) to fun builds struct setter with fun type (1) builds struct setter with fun type (1) codegens struct access with -> and then . codegens struct access with -> and then . codegens pointer malloc of struct codegens pointer malloc of struct can access member of uninitialized struct behind type (#8774) can access member of uninitialized struct behind type (#8774) automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s codegens set struct value with constant codegens set struct value with constant codegens union inside struct codegens union inside struct codegens struct property default value codegens struct property default value .validate_name uppercase uppercase underscores underscores digits digits length length invalid character invalid character dashes dashes empty empty Code gen: generic class type inherited instance var initialize from generic to concrete (#2128) inherited instance var initialize from generic to concrete (#2128) doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for Tuple (#2839) 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 consider abstract types for including types (#7200) doesn't consider abstract types for including types (#7200) declares instance var with virtual T (#1675) declares instance var with virtual T (#1675) doesn't override guessed instance var in generic type if already declared in superclass (#9431) doesn't override guessed instance var in generic type if already declared in superclass (#9431) doesn't use virtual + in type arguments for NamedTuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type codegens inherited generic class instance var codegens inherited generic class instance var codegens static array size after instantiating codegens static array size after instantiating allows initializing instance variable (#665) allows initializing instance variable (#665) instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) 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) runs generic instance var initializers in superclass's metaclass context (2) (#6482) runs generic instance var initializers in superclass's metaclass context (2) (#6482) 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) codegens virtual generic metaclass macro method call codegens virtual generic metaclass macro method call 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) inherited instance var initialize from generic to generic to concrete (#2128) inherited instance var initialize from generic to generic to concrete (#2128) invokes super in generic class (#2354) invokes super in generic class (#2354) codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 codegens compile-time interpreted generic int128 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 crash on generic type restriction with no subtypes (#7583) doesn't crash on generic type restriction with no subtypes (#7583) doesn't consider abstract generic instantiation when restricting type (#5190) doesn't consider abstract generic instantiation when restricting type (#5190) Semantic: pointer types pointer value on typedef types pointer value on typedef type pointer casting of object type type pointer casting of object type can't do Pointer.malloc without type var can't do Pointer.malloc without type var detects recursive pointerof expansion (#551) (#553) detects recursive pointerof expansion (#551) (#553) errors with non-matching generic value with value=, generic type (#10211) errors with non-matching generic value with value=, generic type (#10211) 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 detects recursive pointerof expansion (2) (#1654) detects recursive pointerof expansion (2) (#1654) pointer malloc creates new type pointer malloc creates new type type pointer casting type pointer casting detects recursive pointerof expansion (3) detects recursive pointerof expansion (3) types pointer add types pointer add types pointer of constant types pointer of constant can assign pointerof virtual type (#8216) can assign pointerof virtual type (#8216) takes pointerof lib external var takes pointerof lib external var types pointer diff types pointer diff pointer of value error pointer of value error errors with non-matching generic value with value= (#10211) errors with non-matching generic value with value= (#10211) pointer of class raises error pointer of class raises error types int pointer types int pointer create pointer by address create pointer by address says undefined variable (#7556) says undefined variable (#7556) types realloc types realloc 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 detects recursive pointerof expansion (4) detects recursive pointerof expansion (4) types Pointer.malloc types Pointer.malloc errors with non-matching generic value with value=, union of generic types (#10544) errors with non-matching generic value with value=, union of generic types (#10544) errors if doing Pointer.allocate errors if doing Pointer.allocate can assign nil to void pointer can assign nil to void pointer doesn't crash if pointerof expansion type has generic splat parameter (#11808) doesn't crash if pointerof expansion type has generic splat parameter (#11808) types pointer value types pointer value Semantic: super invokes super inside macro (#6636) invokes super inside macro (#6636) types super with named arguments, def has bare splat parameter (2) (#8895) types super with named arguments, def has bare splat parameter (2) (#8895) errors no superclass method in top-level def errors no superclass method in top-level def gives correct error when calling super and target is abstract method (#2675) gives correct error when calling super and target is abstract method (#2675) says correct error message when no overload matches in super call (#272) says correct error message when no overload matches in super call (#272) 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) errors no superclass method in top-level errors no superclass method in top-level types super with forwarded arguments, different internal names (#8895) types super with forwarded arguments, different internal names (#8895) types super with forwarded arguments, parent has parameters types super with forwarded arguments, parent has parameters calls super in generic module method calls super in generic module method errors if calling super on module method and not found errors if calling super on module method and not found 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 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) 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 when inside fun types super when inside fun finds super initialize if not explicitly defined in superclass, 1 (#273) finds super initialize if not explicitly defined in superclass, 1 (#273) types super without arguments types super without arguments types super with named arguments, def has bare splat parameter (#8895) types super with named arguments, def has bare splat parameter (#8895) types super when inside fun and forwards args types super when inside fun and forwards args types super when container method is defined in parent class types super when container method is defined in parent class types super with forwarded arguments, def has double splat parameter (#8895) types super with forwarded arguments, def has double splat parameter (#8895) errors on super where only target would be a top level method (#5201) errors on super where only target would be a top level method (#5201) calls super in module method (2) (#556) calls super in module method (2) (#556) types super with forwarded arguments, def has bare splat parameter (#8895) types super with forwarded arguments, def has bare splat parameter (#8895) finds super initialize if not explicitly defined in superclass, 2 (#273) finds super initialize if not explicitly defined in superclass, 2 (#273) errors no superclass method errors no superclass method calls super in module method (1) (#556) calls super in module method (1) (#556) calls super in module method (3) (#556) calls super in module method (3) (#556) Semantic: def overload 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 type second overload types a call with overload type second overload types a call with overload self types a call with overload self types a call with overload self with inherited type types a call with overload self with inherited type does not consider global paths as free variables (2) does not consider global paths as free variables (2) types a call with overload with yield types a call with overload with yield single type restriction wins over union single type restriction wins over union restrict virtual type with virtual type restrict virtual type with virtual type dispatches with named arg dispatches with named arg types a call with overload selecting the most restrictive 2 types a call with overload selecting the most restrictive 2 includes splat symbol in error message includes splat symbol in error message resets free vars after a partial match is rejected (#10270) resets free vars after a partial match is rejected (#10270) reports no overload matches with correct method owner (#2083) reports no overload matches with correct method owner (#2083) prefers more specific overload than one with free variables prefers more specific overload than one with free variables errors if union restriction has multiple free vars (2) errors if union restriction has multiple free vars (2) uses method defined in base class if the restriction doesn't match uses method defined in base class if the restriction doesn't match types a call with overload self other match types a call with overload self other match types a call with overload matches virtual 3 types a call with overload matches virtual 3 errors if generic type doesn't match errors if generic type doesn't match matches tuple with underscore matches tuple with underscore lookup matches in virtual type inside union lookup matches in virtual type inside union considers NamedTuple in a module's including types (#10380) considers NamedTuple in a module's including types (#10380) 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 resets free vars after a partial match is rejected (2) (#10185) resets free vars after a partial match is rejected (2) (#10185) matches virtual type to union matches virtual type to union gives correct error message, looking up parent defs, when no overload matches gives correct error message, looking up parent defs, when no overload matches 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 matches a union argument with free var matches a union argument with free var errors if no overload matches on union against named arg (#2640) errors if no overload matches on union against named arg (#2640) types a call with overload Object type first overload types a call with overload Object type first overload finds method after including module in generic module (#1201) finds method after including module in generic module (#1201) overloads on metaclass (3) (#2916) overloads on metaclass (3) (#2916) matches tuples and uses free var matches tuples and uses free var restricts union to generic class restricts union to generic class matches a generic module argument matches a generic module argument does not consider global paths as free variables (1) does not consider global paths as free variables (1) uses long name when no overload matches and name is the same (#1030) uses long name when no overload matches and name is the same (#1030) matches a union argument with free var, more types (1) matches a union argument with free var, more types (1) overloads union against non-union (#2904) overloads union against non-union (#2904) dispatch call to def with restrictions dispatch call to def with restrictions matches a generic module argument with free var (2) matches a generic module argument with free var (2) types a call with overload matches virtual 2 types a call with overload matches virtual 2 types a call with overload types a call with overload errors when binding free variable to different types errors when binding free variable to different types treats single splats with same restriction as equivalent (#12579) treats single splats with same restriction as equivalent (#12579) restricts on generic type without type arg restricts on generic type without type arg gets free variable from union restriction (2) gets free variable from union restriction (2) types a call with overload type first overload types a call with overload type first overload types a call with overload self in included module other type types a call with overload self in included module other type restricts on generic type with free type arg restricts on generic type with free type arg errors when binding free variable to different types (2) errors when binding free variable to different types (2) types a call with overload with yield the other way types a call with overload with yield the other way types a call with overload matches virtual types a call with overload matches virtual gives better error message with consecutive arguments sizes gives better error message with consecutive arguments sizes filter union type with virtual filter union type with virtual overloads on metaclass (2) (#2916) overloads on metaclass (2) (#2916) treats single splats with same restriction as equivalent (2) (#12579) treats single splats with same restriction as equivalent (2) (#12579) compare self type with others compare self type with others doesn't crash on unknown metaclass doesn't crash on unknown metaclass can call overload with aliased generic restriction can call overload with aliased generic restriction accepts overload with nilable type restriction accepts overload with nilable type restriction overloads on metaclass (#2916) overloads on metaclass (#2916) errors if union restriction has multiple free vars errors if union restriction has multiple free vars matches a union metaclass argument with free var (#8071) matches a union metaclass argument with free var (#8071) overloads with named argument (#4465) overloads with named argument (#4465) matches on partial union matches on partial union matches a generic module argument with free var matches a generic module argument with free var gets free variable from union restriction gets free variable from union restriction 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 self in included module types a call with overload self in included module 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 restriction vs single splat with stricter restriction positional parameter with restriction vs single splat with stricter restriction single splat vs single splat with restriction (#3134) single splat vs single splat with restriction (#3134) positional parameter with stricter restriction vs single splat with restriction positional parameter with stricter restriction vs single splat with restriction specificity specificity 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 subsumption conflicts named vs named named vs named positional vs positional positional vs positional positional vs named positional vs named named vs double splat named vs double splat positional vs single splat positional vs single splat positional vs double splat positional vs double splat single splat vs double splat single splat vs double splat single splat vs named single splat vs named specificity conflicts, named vs named (required > optional) vs (required > optional) (required > optional) vs (required > optional) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (required > optional) vs (required > splat) (required > optional) vs (required > splat) (required > splat) vs (required > splat) (required > splat) vs (required > splat) subsumption has higher precedence over specificity positional vs (optional named > double splat) positional vs (optional 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) same positional parameter, required > single splat same positional parameter, required > single splat positional vs (required named > optional named) positional vs (required named > optional named) positional vs (required positional > single splat) positional vs (required positional > single splat) named vs (optional positional > single splat) named vs (optional positional > single splat) double splat vs (optional positional > single splat) double splat vs (optional positional > single splat) named vs (optional named > double splat) named vs (optional named > double splat) positional vs (optional positional > single splat) positional vs (optional positional > single splat) single splat vs (required named > double splat) single splat vs (required named > double splat) positional vs (required named > double splat) positional vs (required named > double splat) named vs (required positional > optional positional) named vs (required positional > optional positional) single splat vs (optional named > double splat) single splat vs (optional named > double splat) same positional parameter, optional > single splat same positional parameter, optional > single splat same named parameter, required > double splat same named parameter, required > double splat same named parameter, optional > double splat same named parameter, optional > double splat same named parameter, required > optional same named parameter, required > optional named vs (required named > double splat) named vs (required named > double splat) positional vs (required positional > optional positional) positional vs (required positional > optional positional) double splat vs (required positional > single splat) double splat vs (required positional > single splat) same positional parameter, required > optional same positional parameter, required > optional double splat vs (required positional > optional positional) double splat vs (required positional > optional positional) single splat vs (required named > optional named) single splat vs (required named > optional named) named parameters 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 specificity specificity named parameter with restriction vs double splat (#5328) named parameter with restriction vs double splat (#5328) double splat restriction vs double splat with stricter restriction double splat restriction vs double splat with stricter restriction 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 conflicts, positional vs named (required > optional) vs (required > splat) (required > optional) vs (required > splat) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (optional > splat) vs (required > optional) (optional > splat) vs (required > optional) (optional > splat) vs (required > splat) (optional > splat) vs (required > splat) (required > splat) vs (required > splat) (required > splat) vs (required > splat) (required > splat) vs (required > optional) (required > splat) vs (required > optional) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (required > optional) vs (required > optional) (required > optional) vs (required > optional) doesn't match tuples of different sizes doesn't match tuples of different sizes gets free variable from union restriction without a union gets free variable from union restriction without a union matches generic class instance type with another one matches generic class instance type with another one matches tuples of different sizes matches tuples of different sizes can call overload with generic restriction can call overload with generic restriction matches types with free variables matches types with free variables 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) restrict matches to minimum necessary 1 restrict matches to minimum necessary 1 types a call with overload selecting the most restrictive types a call with overload selecting the most restrictive Codegen: super calls super with dispatch (#2318) calls super with dispatch (#2318) calls super in module method (#556) calls super in module method (#556) calls super from virtual metaclass type (#2841) calls super from virtual metaclass type (#2841) codegens super that calls subclass method 6 codegens super that calls subclass method 6 does super in virtual type including module does super in virtual type including module 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) codegens super that calls subclass method 3 codegens super that calls subclass method 3 codegens super inside closure codegens super inside closure codegens super without arguments but parent has arguments codegens super without arguments but parent has arguments codegens super that calls subclass method 2 codegens super that calls subclass method 2 build super on generic class (bug) build super on generic class (bug) 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 5 codegens super that calls subclass method 5 calls super on an object (#10004) calls super on an object (#10004) codegens super without arguments and instance variable codegens super without arguments and instance variable codegens super inside closure forwarding args codegens super inside closure forwarding args codegens super that calls subclass method codegens super that calls subclass method codegens super without arguments codegens super without arguments calls super in generic module method calls super in generic module method .parse_args NAME DIR NAME DIR DIR (relative to home) DIR (relative to home) DIR with path DIR with path DIR DIR DIR = . DIR = . DIR (absolute) DIR (absolute) Semantic: warnings deprecated constants detects deprecated constants in type declarations (2) detects deprecated constants in type declarations (2) detects deprecated constants in type declarations (3) detects deprecated constants in type declarations (3) detects deprecated constants detects deprecated constants detects deprecated constants inside macros detects deprecated constants inside macros detects deprecated constants in type declarations (1) detects deprecated constants in type declarations (1) deprecated macros detects deprecated macros with named arguments detects deprecated macros with named arguments detects top-level deprecated macros detects top-level deprecated macros ignore deprecation excluded locations ignore deprecation excluded locations informs warnings once per call site location (b) informs warnings once per call site location (b) deprecation reason is optional deprecation reason is optional detects deprecated module macros detects deprecated module macros errors if too many arguments errors if too many arguments detects deprecated class macros detects deprecated class macros errors if invalid argument type errors if invalid argument type errors if invalid named argument errors if invalid named argument informs warnings once per call site location (a) informs warnings once per call site location (a) detects deprecated generic class macros detects deprecated generic class macros deprecated methods detects deprecated initialize with named arguments detects deprecated initialize with named arguments detects deprecated module methods detects deprecated module methods detects deprecated class methods detects deprecated class methods detects deprecated initialize detects deprecated initialize detects deprecated methods with named arguments detects deprecated methods with named arguments detects deprecated generic class methods detects deprecated generic class methods errors if invalid named arguments errors if invalid named arguments ignore deprecation excluded locations ignore deprecation excluded locations informs warnings once per yield informs warnings once per yield detects top-level deprecated methods detects top-level deprecated methods errors if invalid argument type errors if invalid argument type informs warnings once per call site location (a) informs warnings once per call site location (a) detects deprecated instance methods detects deprecated instance methods detects deprecated generic instance methods detects deprecated generic instance methods ignores nested calls to deprecated methods ignores nested calls to deprecated methods errors if too many arguments errors if too many arguments informs warnings once per call site location (b) informs warnings once per call site location (b) informs warnings once per target type informs warnings once per target type deprecation reason is optional deprecation reason is optional abstract def positional parameter name mismatch detects mismatch within many parameters detects mismatch within many parameters doesn't compare positional parameters to single splat doesn't compare positional parameters to single splat doesn't warn if external parameter name matches (2) doesn't warn if external parameter name matches (2) informs warnings once per matching overload (1) informs warnings once per matching overload (1) 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) respects external names of positional parameters (1) respects external names of positional parameters (1) informs warnings once per matching overload (2) informs warnings once per matching overload (2) detects mismatch with single parameter detects mismatch with single parameter continues warning if implementation with matching parameters is not found (#12150) single splat single splat not a full implementation not a full implementation double splat double splat doesn't warn if current type is a module (#12266) doesn't warn if current type is a module (#12266) detects multiple mismatches detects multiple mismatches stops warning after implementation with matching parameters is found (#12150) different single splats different single splats contravariant restrictions contravariant restrictions exact match exact match reordered named parameters reordered named parameters respects external names of positional parameters (2) respects external names of positional parameters (2) doesn't warn if current type is abstract (#12266) doesn't warn if current type is abstract (#12266) exposes syntax warnings after macro interpolation exposes syntax warnings after macro interpolation deprecated annotations detects deprecated namespaced annotations detects deprecated namespaced annotations detects deprecated annotations detects deprecated annotations exposes syntax warnings exposes syntax warnings Normalize: chained comparisons normalizes two comparisons with literal normalizes two comparisons with literal normalizes one comparison with literal normalizes one comparison with literal normalizes one comparison with call normalizes one comparison with call normalizes one comparison with var normalizes one comparison with var normalizes two comparisons with calls normalizes two comparisons with calls Codegen: special vars allows with struct allows with struct preserves special vars if initialized inside block (#2194) preserves special vars if initialized inside block (#2194) preserves special vars in macro expansion with call with default arguments (#824) preserves special vars in macro expansion with call with default arguments (#824) codegens with default argument codegens with default argument codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens after block codegens $~ two levels codegens $~ two levels works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens $~ with nilable (2) codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens $~ codegens $~ codegens after block 2 codegens after block 2 codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $~ with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens $? with nilable (1) codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block codegens in block allows with primitive allows with primitive codegens $? codegens $? Semantic: enum errors if declaring type inside enum (#3127) errors if declaring type inside enum (#3127) errors if enum value is too big for type (#678) errors if enum value is too big for type (#678) types enum types 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 reopens an enum reopens an enum gives error on unsigned flags enum overflow after a member with value gives error on unsigned flags enum overflow after a member with value doesn't break assigned values in enum flags when a member has value 0 (#5767) doesn't break assigned values in enum flags when a member has value 0 (#5767) doesn't error when defining a method for an enum with flags doesn't error when defining a method for an enum with flags types enum value types enum value doesn't overflow on flags member (#7877) doesn't overflow on flags member (#7877) 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 overflow when going from negative to zero (#7874) doesn't overflow when going from negative to zero (#7874) errors if inheriting Enum (#3592) errors if inheriting Enum (#3592) errors if declaring type inside enum, nested (#3127) errors if declaring type inside enum, nested (#3127) finds class method in enum type finds class method in enum type errors if using a name twice errors if using a name twice creates enum from value creates enum from value reopens enum with same base type (1) reopens enum with same base type (1) has None value when defined as @[Flags] has None value when defined as @[Flags] disallows All value for @[Flags] enum disallows All value for @[Flags] enum defines class method on enum defines class method on enum errors if defining initialize in Enum (#7238) errors if defining initialize in Enum (#7238) reopens enum with same base type (2) reopens enum with same base type (2) disallows implicit conversion of int to enum disallows implicit conversion of int to enum gives error on enum overflow gives error on enum overflow gives error on enum overflow after a member with value gives error on enum overflow after a member with value errors if reopening enum with different base type (2) errors if reopening enum with different base type (2) has All value when defined as @[Flags] has All value when defined as @[Flags] can redefine Enum.new can redefine Enum.new gives error on signed flags enum overflow after a member with value gives error on signed 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) doesn't visit enum members generated by macros twice (#10104) doesn't visit enum members generated by macros twice (#10104) reopens enum without base type (1) reopens enum without base type (1) disallows redefining None to non-0 for @[Flags] enum disallows redefining None to non-0 for @[Flags] enum defines method on enum defines method on enum can use macro expression inside enum can use macro expression inside enum reopens enum without base type (2) reopens enum without base type (2) gives error on flags enum overflow gives error on flags enum overflow errors if invoking private enum method errors if invoking private enum method can use macro for inside enum can use macro for inside enum marks as flags with base type (#2185) marks as flags with base type (#2185) allows redefining None to 0 for @[Flags] enum allows redefining None to 0 for @[Flags] enum errors if using instance var inside enum (#991) errors if using instance var inside enum (#991) errors if reopen but not enum errors if reopen but not enum errors on enum without members (#3447) errors on enum without members (#3447) finds method in enum type finds method in enum type allows class vars in enum allows class vars in enum attaches annotation to enum method (#6690) attaches annotation to enum method (#6690) errors if reopen and tries to define constant errors if reopen and tries to define constant Crystal::Repl::Interpreter exception handling executes ensure when breaking from a block executes ensure when breaking from a block captures exception in variable captures exception in variable does else does else executes ensure when returning from a block (2) executes ensure when returning from a block (2) does ensure without rescue/raise does ensure without rescue/raise executes ensure when exception is raised in rescue executes ensure when exception is raised in rescue raises and rescues specific exception type raises and rescues specific exception type raises and rescues anything raises and rescues anything does ensure for else when else raises does ensure for else when else raises executes ensure when exception is raised in body executes ensure when exception is raised in body executes ensure when returning from a block executes ensure when returning from a block executes ensure when returning a big value from a block executes ensure when returning a big value from a block does rescue when nothing is raised does rescue when nothing is raised raises and rescues anything, does ensure when an exception is rescued raises and rescues anything, does ensure when an exception is rescued does ensure for else does ensure for else does ensure with explicit return does ensure with explicit return Code gen: var 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 works with typeof with assignment (#828) works with typeof with assignment (#828) 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 assigns to underscore assigns to underscore codegens assignment that can never be reached codegens assignment that can never be reached codegens var codegens 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 Semantic: while reports break cannot be used outside a while reports break cannot be used outside a while types endless while with multiple breaks with value types endless while with multiple breaks with value types while true as NoReturn types while true as NoReturn 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 doesn't modify var's type before while doesn't modify var's type before while finds all while cond assign targets in expressions (3) finds all while cond assign targets in expressions (3) finds all while cond assign targets in expressions (5) finds all while cond assign targets in expressions (5) 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 endless while with break with value types endless while with break with value doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition finds all while cond assign targets in expressions (4) finds all while cond assign targets in expressions (4) types while types while doesn't use type at end of endless while if variable is reassigned (2) doesn't use type at end of endless while if variable is reassigned (2) types while with multiple breaks with value types while with multiple breaks with value finds all while cond assign targets in expressions (2) finds all while cond assign targets in expressions (2) rebinds condition variable after while body (#6158) rebinds condition variable after while body (#6158) 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 ((true)) as NoReturn types while ((true)) as NoReturn doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) restricts type after `while` with `not` and `and` (#4242) restricts type after `while` with `not` and `and` (#4242) finds while cond assign target in Not (#10345) finds while cond assign target in Not (#10345) 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) 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) 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 types while with break with value types while with break with value finds all while cond assign targets in expressions (#10350) finds all while cond assign targets in expressions (#10350) types while with break without value types while with break without value types variable as nilable if raise before assign types variable as nilable if raise before assign types while (true) as NoReturn types while (true) as NoReturn doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition types endless while with break without value types endless while with break without value types while with assignment and && types while with assignment and && reports next cannot be used outside a while reports next cannot be used outside a while restricts type after while (#4242) restricts type after while (#4242) types while with && (#1425) types while with && (#1425) types while with assignment types while with assignment doesn't type var as nilable after break inside rescue doesn't type var as nilable after break inside rescue types while with assignment and call types while with assignment and call 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 doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (2) doesn't restrict type after while if there's a break (#4242) doesn't restrict type after while if there's a break (#4242) uses var type inside while if endless loop (2) uses var type inside while if endless loop (2) finds all while cond assign targets in expressions (6) finds all while cond assign targets in expressions (6) Normalize: unless normalizes unless normalizes unless Code gen: type declaration codegens initialize instance var codegens initialize instance var codegens initialize instance var of superclass codegens initialize instance var of superclass declares and initializes declares and initializes codegens initialize instance var with var declaration codegens initialize instance var with var declaration declares and initializes var declares and initializes var Code gen: def with default value considers first the one with more arguments considers first the one with more arguments considers first the one with a restriction considers first the one with a restriction codegens def with one default value codegens def with one default value resolves expanded call to current type, not to virtual type resolves expanded call to current type, not to virtual type codegens def new with one default value codegens def new with one default value doesn't mix types of instance vars with initialize and new doesn't mix types of instance vars with initialize and new Crystal::CrystalPath finds "../test_folder" finds "../test_folder" finds "test_files/*" finds "test_files/*" finds "test_files/file_one" finds "test_files/file_one" doesn't finds "../../src/file_three" doesn't finds "../../src/file_three" 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" finds "test_files/file_four" finds "test_files/file_four" finds "./test_folder/*" finds "./test_folder/*" overrides path with environment variable overrides path with environment variable finds "test_files/**" finds "test_files/**" finds "./test_folder/file_three.cr" finds "./test_folder/file_three.cr" includes 'lib' by default includes 'lib' by default .expand_paths .expand_paths doesn't finds "test_folder/file_three.cr" doesn't finds "test_folder/file_three.cr" finds "../**" finds "../**" finds "test_files/yet_another" finds "test_files/yet_another" finds "crystal_path_spec" finds "crystal_path_spec" doesn't finds "file_two.cr" doesn't finds "file_two.cr" finds "test_files/file_one" finds "test_files/file_one" finds "foo.cr" finds "foo.cr" finds "test_files/another" finds "test_files/another" doesn't finds "./crystal_path_spec" doesn't finds "./crystal_path_spec" doesn't finds "../crystal_path/test_files/file_one" doesn't finds "../crystal_path/test_files/file_one" finds "test_files/file_three" finds "test_files/file_three" #each_file_expansion foo.cr/bar foo.cr/bar ./foo ./foo ./foo/bar/baz ./foo/bar/baz foo.cr foo.cr foo.cr/bar.cr foo.cr/bar.cr foo/bar foo/bar foo/bar/baz foo/bar/baz ./foo.cr ./foo.cr foo foo ./foo/bar ./foo/bar finds "test_files" finds "test_files" finds "test_files/file_one.cr" finds "test_files/file_one.cr" doesn't finds "test_folder/*" doesn't finds "test_folder/*" doesn't finds "test_files/missing_file.cr" doesn't finds "test_files/missing_file.cr" finds "other_test_files" finds "other_test_files" doesn't finds "./crystal_path_spec.cr" doesn't finds "./crystal_path_spec.cr" finds "./file_two.cr" finds "./file_two.cr" Normalize: def expands with magic constant expands with magic constant gives correct body location with default arg with restriction, with body default arg with restriction, with body block instance var arg, without body block instance var arg, without body default arg with restriction, without body default arg with restriction, without body default arg, with body default arg, with body block instance var arg, with body block instance var arg, with body splat arg, without body splat arg, without body splat arg, with body splat arg, with body default arg, without body default arg, without body expands a def on request with default arguments (2) expands a def on request with default arguments (2) expands with one named arg that is the only one (1) expands with one named arg that is the only one (1) expands with named argument and yield expands with named argument and yield expands with two named argument and one not expands with two named argument and one not expands a def on request with default arguments (external names) expands a def on request with default arguments (external names) expands a def with external names (1) expands a def with external names (1) expands with splat and default argument expands with splat and default argument 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 expands a def on request with default arguments that yields 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 a def on request with default arguments and type restrictions (2) expands a def on request with default arguments and type restrictions (2) expands with splat expands with splat expands with magic constant specifying one when not all are magic expands with magic constant specifying one when not all are magic 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 a def with splat and double splat expands a def with splat and double splat expands with two named argument expands with two named argument expands a def with double splat and two named args expands a def with double splat and two named args expands default value after splat index expands default value after splat index expands a def on request with default arguments and type restrictions expands a def on request with default arguments and type restrictions expands with magic constant with named arg expands with magic constant with named arg expands a def on request with default arguments that yields (external names) expands a def on request with default arguments that yields (external names) expands def with reserved external name (#6559) expands def with reserved external name (#6559) expands a def with double splat and no args expands a def with double splat and no args expands with magic constant specifying one when all are magic expands with magic constant specifying one when all are magic expands with splat and zero expands with splat and zero expands with more named arg which come in the correct order expands with more named arg which come in the correct order expands with magic constant with named arg with yield expands with magic constant with named arg with yield expands a def on request with default arguments that yields (2) expands a def on request with default arguments that yields (2) expands arg with default value after splat expands arg with default value after splat expands a def with external names (2) expands a def with external names (2) 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 with splat with one arg before expands with splat with one arg before Semantic: splat matches with splat matches with splat says no overload matches on type restrictions past the splat arg says no overload matches on type restrictions past the splat arg calls super with implicit splat arg (#1001) calls super with implicit splat arg (#1001) uses bare * uses bare * overloads with type restriction and splat (3) overloads with type restriction and splat (3) errors with too many non-splat type arguments errors with too many non-splat type arguments method with splat and optional named argument matches zero args call (#2746) method with splat and optional named argument matches zero args call (#2746) overloads with type restriction and splat (7) overloads with type restriction and splat (7) matches with type var and splat of itself inside explicit Union matches with type var and splat of itself inside explicit Union errors with too few non-splat type arguments (2) errors with too few non-splat type arguments (2) 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 overloads with splat against method with two arguments (#986) (1) overloads with splat against method with two arguments (#986) (1) 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 matches with type var and splat of itself inside explicit Union (3) matches with type var and splat of itself inside explicit Union (3) forwards tuple with an extra argument forwards tuple with an extra argument errors if splatting non-tuple type in call arguments errors if splatting non-tuple type in call arguments matches instantiated generic with splat in generic type matches instantiated generic with splat in generic type matches type splat with splat in generic type (1) matches type splat with splat in generic type (1) splats arg and splat against splat (2) (#1042) splats arg and splat against splat (2) (#1042) matches with type var and splat of itself inside explicit Union (2) matches with type var and splat of itself inside explicit Union (2) forwards tuple in return statement forwards tuple in return statement errors if splatting non-tuple type in return values errors if splatting non-tuple type in return values matches type splat with splat in generic type (2) matches type splat with splat in generic type (2) uses splat restriction uses splat restriction matches partially instantiated generic with splat in generic type matches partially instantiated generic with splat in generic type errors on zero args with named arg and splat errors on zero args with named arg and splat gives correct error when forwarding splat gives correct error when forwarding splat matches with type var splat inside explicit Union (2) matches with type var splat inside explicit Union (2) Crystal::Splat with splat with splat without splat without splat overloads with type restriction and splat (6) overloads with type restriction and splat (6) overloads with type restriction and splat (1) overloads with type restriction and splat (1) can splat after type filter left it as a tuple (#442) can splat after type filter left it as a tuple (#442) overloads with type restriction and splat (5) overloads with type restriction and splat (5) gives correct error when forwarding splat (2) gives correct error when forwarding splat (2) allows default value after splat index allows default value after splat index doesn't crash on non-match (#2521) doesn't crash on non-match (#2521) errors if doesn't match splat with type restriction errors if doesn't match splat with type restriction method with default arguments and splat matches call with one arg (#2766) method with default arguments and splat matches call with one arg (#2766) errors if using two splat indices on restriction errors if using two splat indices on restriction says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat uses splat restriction after non-splat arguments (#5037) uses splat restriction after non-splat arguments (#5037) uses splat restriction, matches empty uses splat restriction, matches empty uses bare *, doesn't let more args uses bare *, doesn't let more args works if matches splat with type restriction works if matches splat with type restriction overloads with type restriction and splat (2) overloads with type restriction and splat (2) redefines method with splat (bug #248) redefines method with splat (bug #248) splats arg and splat against splat (1) (#1042) splats arg and splat against splat (1) (#1042) matches with type var splat inside explicit Union matches with type var splat inside explicit Union errors with too few non-splat type arguments (1) errors with too few non-splat type arguments (1) doesn't shift a call's location doesn't shift a call's location overloads with splat against method with two arguments (#986) (2) overloads with splat against method with two arguments (#986) (2) splats splats errors if splatting union errors if splatting union accesses T when empty, via module accesses T when empty, via module 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 overloads with type restriction and splat (4) overloads with type restriction and splat (4) doesn't match splat in generic type with unsplatted tuple (#10164) doesn't match splat in generic type with unsplatted tuple (#10164) doesn't match free var type splats inside explicit Union doesn't match free var type splats inside explicit Union 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 splat restriction with concrete type uses splat restriction with concrete type matches with tuple splat inside explicit Union matches with tuple splat inside explicit Union Crystal::Repl::Interpreter multidispatch doesn't compile block if it's not used (no yield) doesn't compile block if it's not used (no yield) does dispatch on receiver type and argument type does dispatch on receiver type and argument type does dispatch on one argument does dispatch on one argument does dispatch on virtual type does dispatch on virtual type does multidispatch with captured block (#12217) does multidispatch with captured block (#12217) does multidispatch on virtual metaclass type (2) does multidispatch on virtual metaclass type (2) 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) casts multidispatch argument to the def's arg type casts multidispatch argument to the def's arg type does dispatch on one argument inside module with explicit receiver does dispatch on one argument inside module with explicit receiver does dispatch on one argument with block does dispatch on one argument with block passes self as pointer when doing multidispatch passes self as pointer when doing multidispatch does dispatch on one argument inside module with implicit self does dispatch on one argument inside module with implicit self passes self as pointer when doing multidispatch (2) passes self as pointer when doing multidispatch (2) does dispatch on receiver type and argument type, multiple times does dispatch on receiver type and argument type, multiple times initialize multidispatch initialize multidispatch does multidispatch with mandatory named arguments does multidispatch with mandatory named arguments does multidispatch on virtual metaclass type (1) does multidispatch on virtual metaclass type (1) does dispatch on receiver type does dispatch on receiver type Code gen: c union codegens union property setter 1 via pointer codegens union property setter 1 via pointer codegens union property setter 2 codegens union property setter 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 1 codegens union property setter 1 codegens union property default value 2 codegens union property default value 2 codegens union property setter 2 via pointer codegens union property setter 2 via pointer codegens union property default value codegens union property default value automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe builds union setter with fun type builds union setter with fun type fills union type to the max size fills union type to the max size reads union instance var reads union instance var automatically converts numeric union type in field assignment automatically converts numeric union type in field assignment codegens assign c union to union codegens assign c union to union aligns to the member with biggest align requirements aligns to the member with biggest align requirements automatically converts numeric type in field assignment automatically converts numeric type in field assignment does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s does to_s codegens struct inside union codegens struct inside union Semantic: method_missing 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) errors if method_missing expands to multiple methods errors if method_missing expands to multiple methods errors if method_missing expands to an incorrect method errors if method_missing expands to an incorrect method does error in method_missing if wrong number of params does error in method_missing if wrong number of params does error in method_missing macro with virtual type does error in method_missing macro with virtual type does method missing for generic type does method missing for generic type finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' ASTNode#to_s does to_s of "macro foo(*var)\nend" does to_s of "macro foo(*var)\nend" 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 "foo : A | (B -> C)" does to_s of "foo : A | (B -> C)" 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(x, **args, &block)\nend" does to_s of "def foo(x, **args, &block)\nend" does to_s of "1.~(2)" does to_s of "1.~(2)" does to_s of "(1 & 2) & (3 | 4)" does to_s of "(1 & 2) & (3 | 4)" does to_s of "1.responds_to?(:to_s)" does to_s of "1.responds_to?(:to_s)" does to_s of "1.0" does to_s of "1.0" does to_s of "{\"foo bar\": 1}" does to_s of "{\"foo bar\": 1}" does to_s of "macro foo\n{% @type %}\nend" does to_s of "macro foo\n{% @type %}\nend" does to_s of "case 1; in .foo?; 2; end" does to_s of "case 1; in .foo?; 2; end" does to_s of "1e10_f64" does to_s of "1e10_f64" does to_s of "!a" does to_s of "!a" 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 "->(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 "def foo(*args : _)\nend" does to_s of "def foo(*args : _)\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 "1_f32" does to_s of "1_f32" 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 "macro foo(x)\n yield\nend" does to_s of "macro foo(x)\n yield\nend" does to_s of "begin\n (1)\nrescue\nend" does to_s of "begin\n (1)\nrescue\nend" does to_s of "foo._bar(1)" does to_s of "foo._bar(1)" does to_s of "foo._bar" does to_s of "foo._bar" 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(**args : T)\nend" does to_s of "def foo(**args : T)\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).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 "{{ foo }}" does to_s of "{{ foo }}" does to_s of "{ {1 => 2} }" does to_s of "{ {1 => 2} }" does to_s of "%r()imx" does to_s of "%r()imx" does to_s of "/hello world/" does to_s of "/hello world/" does to_s of "case 1; when .foo?; 2; end" does to_s of "case 1; when .foo?; 2; end" does to_s of "%x(whoami)" does to_s of "%x(whoami)" does to_s of "macro foo(**args)\nend" does to_s of "macro foo(**args)\nend" 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 "1.[]=" does to_s of "1.[]=" 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 "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{% 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 "alias Foo::Bar = Void" does to_s of "alias Foo::Bar = Void" 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 "lib Foo\nend" does to_s of "lib Foo\nend" does to_s of "1.+ do\nend" does to_s of "1.+ do\nend" does to_s of "1.[](2) do\nend" does to_s of "1.[](2) do\nend" does to_s of "foo &.bar(1, 2, 3)" does to_s of "foo &.bar(1, 2, 3)" does to_s of "asm(\"nop\" :: \"a\"(1) :: \"volatile\")" does to_s of "asm(\"nop\" :: \"a\"(1) :: \"volatile\")" does to_s of "foo(x : (T -> U) -> V, W)" does to_s of "foo(x : (T -> U) -> V, W)" does to_s of "macro foo(@[Foo] **args)\nend" does to_s of "macro foo(@[Foo] **args)\nend" 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 "1.//(2, &block)" does to_s of "1.//(2, &block)" 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 "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(x : (T -> U) | V)\nend" does to_s of "def foo(x : (T -> U) | V)\nend" does to_s of "{ {foo: 2} }" does to_s of "{ {foo: 2} }" does to_s of "1.+(&block)" does to_s of "1.+(&block)" does to_s of "def foo(*args)\nend" does to_s of "def foo(*args)\nend" does to_s of "foo.*" does to_s of "foo.*" does to_s of "/ /" does to_s of "/ /" does to_s of "return true ? 1 : 2" does to_s of "return true ? 1 : 2" does to_s of "def foo\n yield\nend" does to_s of "def foo\n yield\nend" 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 "{% if foo %}\n foo_then\n{% end %}" does to_s of "{% if foo %}\n foo_then\n{% end %}" does to_s of "1 & 2 & (3 | 4)" does to_s of "1 & 2 & (3 | 4)" does to_s of "# doc\ndef foo\nend" does to_s of "# doc\ndef foo\nend" does to_s of "asm(\"bl trap\" :::: \"unwind\")" does to_s of "asm(\"bl trap\" :::: \"unwind\")" does to_s of "macro foo(*, var)\nend" does to_s of "macro foo(*, var)\nend" does to_s of "1 && (a = 2)" does to_s of "1 && (a = 2)" does to_s of "/a/x" does to_s of "/a/x" does to_s of "asm(\"nop\" :: \"c\"(3), \"d\"(4) ::)" does to_s of "asm(\"nop\" :: \"c\"(3), \"d\"(4) ::)" does to_s of "..3" does to_s of "..3" does to_s of "begin\n (1)\n 2\nend" does to_s of "begin\n (1)\n 2\nend" does to_s of "%r(/)" does to_s of "%r(/)" does to_s of "{foo: (1 + 2)}" does to_s of "{foo: (1 + 2)}" does to_s of "macro foo\n %bar = 1; end" does to_s of "macro foo\n %bar = 1; end" does to_s of "1 <= (2 <= 3)" does to_s of "1 <= (2 <= 3)" 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 "a.as?(Int32)" does to_s of "a.as?(Int32)" 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 "`\\n\\0`" does to_s of "`\\n\\0`" does to_s of "macro foo\n 123\nend" does to_s of "macro foo\n 123\nend" 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 "begin\n (1)\n 2\nrescue\nend" does to_s of "begin\n (1)\n 2\nrescue\nend" does to_s of "%r()" does to_s of "%r()" does to_s of "&-1" does to_s of "&-1" does to_s of "macro foo(@[Foo] &block)\nend" does to_s of "macro foo(@[Foo] &block)\nend" does to_s of "alias Foo = Void" does to_s of "alias Foo = Void" does to_s of "lib Foo\n FOO = 0\nend" does to_s of "lib Foo\n FOO = 0\nend" does to_s of ":foo" does to_s of ":foo" does to_s of "def foo(@[Foo] **args)\nend" does to_s of "def foo(@[Foo] **args)\nend" does to_s of "(1 + 2).as(Int32)" does to_s of "(1 + 2).as(Int32)" 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 "([] of T).foo" does to_s of "([] of T).foo" does to_s of "macro foo(&)\nend" does to_s of "macro foo(&)\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 "Foo()" does to_s of "Foo()" does to_s of "def foo(**x)\n yield\nend" does to_s of "def foo(**x)\n yield\nend" does to_s of "1.responds_to?(:\"&&\")" does to_s of "1.responds_to?(:\"&&\")" does to_s of "begin\n ()\nend" does to_s of "begin\n ()\nend" does to_s of "foo.nil?" does to_s of "foo.nil?" does to_s of "(1 + 2)..3" does to_s of "(1 + 2)..3" 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 "foo()" does to_s of "foo()" does to_s of "asm(\"nop\" ::: \"e\" : \"volatile\")" does to_s of "asm(\"nop\" ::: \"e\" : \"volatile\")" does to_s of "1.&**" does to_s of "1.&**" 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 "foo : (A | B).class" does to_s of "foo : (A | B).class" does to_s of "1.//(2, a: 3)" does to_s of "1.//(2, a: 3)" does to_s of "!(1 < 2)" does to_s of "!(1 < 2)" does to_s of "foo(a.as(Int32))" does to_s of "foo(a.as(Int32))" does to_s of "->::Foo::Bar.foo" does to_s of "->::Foo::Bar.foo" 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 "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 "foo { |(x, y)| x }" does to_s of "foo { |(x, y)| x }" does to_s of "1[&.foo]" does to_s of "1[&.foo]" does to_s of "Foo(\"bar baz\": Int32)" does to_s of "Foo(\"bar baz\": Int32)" 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 "macro foo(*, __var var)\nend" does to_s of "macro foo(*, __var var)\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 "({} 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 "他.说(\"你好\")" does to_s of "他.说(\"你好\")" 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 "1.as(Int32)" does to_s of "1.as(Int32)" does to_s of "@foo.bar" does to_s of "@foo.bar" does to_s of "(1 || 1.1).as(Int32)" does to_s of "(1 || 1.1).as(Int32)" does to_s of "def foo(x y)\nend" does to_s of "def foo(x y)\nend" does to_s of "{ {1, 2, 3} }" does to_s of "{ {1, 2, 3} }" 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 "macro foo\n\\{%@type %}\nend" does to_s of "macro foo\n\\{%@type %}\nend" does to_s of "def foo(x, **args)\nend" does to_s of "def foo(x, **args)\nend" does to_s of "asm(\"nop\" ::::)" does to_s of "asm(\"nop\" ::::)" does to_s of "1_f64" does to_s of "1_f64" does to_s of "def foo(& : ->)\nend" does to_s of "def foo(& : ->)\nend" does to_s of "/hello world/imx" does to_s of "/hello world/imx" 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 "def foo(x)\n yield\nend" does to_s of "def foo(x)\n yield\nend" does to_s of "%(\"\#{foo}\")" does to_s of "%(\"\#{foo}\")" does to_s of "`\#{1}\\n\\0`" does to_s of "`\#{1}\\n\\0`" does to_s of "def foo(**args)\nend" does to_s of "def foo(**args)\nend" does to_s of "/\#{1 / 2}/" does to_s of "/\#{1 / 2}/" does to_s of "macro foo(x, @[Foo] **args)\nend" does to_s of "macro foo(x, @[Foo] **args)\nend" does to_s of "if true\n (1)\nend" does to_s of "if true\n (1)\nend" does to_s of "foo { |i| i.bar { i } }" does to_s of "foo { |i| i.bar { i } }" does to_s of "\"\\e\\0\\\"\"" does to_s of "\"\\e\\0\\\"\"" does to_s of "macro foo(x, *y)\nend" does to_s of "macro foo(x, *y)\nend" does to_s of "{(1 + 2) => (3 + 4)}" does to_s of "{(1 + 2) => (3 + 4)}" 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 "yield(1)" does to_s of "yield(1)" 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 "(a = 2) && 1" does to_s of "(a = 2) && 1" does to_s of "foo(x : (T -> U) | V)" does to_s of "foo(x : (T -> U) | V)" does to_s of "foo(\"bar baz\": 2)" does to_s of "foo(\"bar baz\": 2)" 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 "def foo(\"bar baz\" qux)\nend" does to_s of "def foo(\"bar baz\" qux)\nend" does to_s of "%r{\#{1}\\/\\0}" does to_s of "%r{\#{1}\\/\\0}" does to_s of "def foo(x, @[Foo] **args)\nend" does to_s of "def foo(x, @[Foo] **args)\nend" does to_s of "->::foo(Int32, String)" does to_s of "->::foo(Int32, String)" does to_s of "あ.い, う.え.お = 1, 2" does to_s of "あ.い, う.え.お = 1, 2" does to_s of ":\"{\"" does to_s of ":\"{\"" 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 "/\\?/" does to_s of "/\\?/" 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{\\/\\0}" does to_s of "%r{\\/\\0}" 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 "-> : Int32 do\nend" does to_s of "-> : Int32 do\nend" does to_s of "macro foo(@[Foo] &)\nend" does to_s of "macro foo(@[Foo] &)\nend" does to_s of "{(1 + 2)}" does to_s of "{(1 + 2)}" does to_s of "1[2, x: 3, &.foo]?" does to_s of "1[2, x: 3, &.foo]?" 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 "begin\n (1)\nend" does to_s of "begin\n (1)\nend" does to_s of "(1 + 2).as?(Int32)" does to_s of "(1 + 2).as?(Int32)" does to_s of "1[&.foo] = 2" does to_s of "1[&.foo] = 2" does to_s of "(1..)" does to_s of "(1..)" does to_s of `#{::String.interpolation(x)}` does to_s of `#{::String.interpolation(x)}` does to_s of "foo(x : Foo((T -> U)))" does to_s of "foo(x : Foo((T -> U)))" does to_s of "[(1 + 2)] of Int32" does to_s of "[(1 + 2)] of Int32" 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 "enum A : B\nend" does to_s of "enum A : B\nend" does to_s of "/\\//" does to_s of "/\\//" does to_s of "1 <= 2 <= 3" does to_s of "1 <= 2 <= 3" does to_s of "type(Foo = Void)" does to_s of "type(Foo = Void)" does to_s of "lib Foo::Bar\nend" does to_s of "lib Foo::Bar\nend" does to_s of "&+1" does to_s of "&+1" 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 "fun foo\nend" does to_s of "fun foo\nend" does to_s of "foo(&.==(2))" does to_s of "foo(&.==(2))" does to_s of "macro foo(@[Foo] id)\nend" does to_s of "macro foo(@[Foo] id)\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(&block)\nend" does to_s of "macro foo(&block)\nend" does to_s of "macro foo\n{{ @type }}\nend" does to_s of "macro foo\n{{ @type }}\nend" does to_s of "1[2, x: 3, &.foo]" does to_s of "1[2, x: 3, &.foo]" does to_s of "%r( )" does to_s of "%r( )" does to_s of "1.+(a: 2)" does to_s of "1.+(a: 2)" 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 "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 "macro foo\n{% verbatim do %}1{% end %}\nend" does to_s of "macro foo\n{% verbatim do %}1{% end %}\nend" does to_s of "asm(\"nop\" :::: \"volatile\")" does to_s of "asm(\"nop\" :::: \"volatile\")" does to_s of "foo { |(x, (y, z))| x }" does to_s of "foo { |(x, (y, z))| x }" does to_s of "/\\s/" does to_s of "/\\s/" does to_s of "foo &.bar" does to_s of "foo &.bar" does to_s of "1.~(2) do\nend" does to_s of "1.~(2) do\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 "macro foo(x, @[Foo] *y)\nend" does to_s of "macro foo(x, @[Foo] *y)\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(3, &.*(2))" does to_s of "foo(3, &.*(2))" does to_s of "(1 <= 2) <= 3" does to_s of "(1 <= 2) <= 3" does to_s of "1[&.foo]?" does to_s of "1[&.foo]?" does to_s of "def foo(& : (->))\nend" does to_s of "def foo(& : (->))\nend" 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 "{% foo %}" does to_s of "{% foo %}" does to_s of "(~1).foo" does to_s of "(~1).foo" does to_s of x = (1 2 ) does to_s of x = (1 2 ) does to_s of "\"\#{1}\\0\"" does to_s of "\"\#{1}\\0\"" 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 "foo(x : (T -> U).class)" does to_s of "foo(x : (T -> U).class)" does to_s of "_foo.bar" does to_s of "_foo.bar" does to_s of "macro foo\n\\{{ @type }}\nend" does to_s of "macro foo\n\\{{ @type }}\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, y, a: 1, b: 2]" does to_s of "foo[x, y, a: 1, b: 2]" does to_s of "foo x: 1, y: 2, &.bar" does to_s of "foo x: 1, y: 2, &.bar" does to_s of "foo.%" does to_s of "foo.%" 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(**options, &block)\nend" does to_s of "def foo(**options, &block)\nend" 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 "def foo(@[Foo] *args)\nend" does to_s of "def foo(@[Foo] *args)\nend" 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 "/\\(group\\)/" does to_s of "/\\(group\\)/" context consider different instances of def consider different instances of def can get context inside initialize can get context inside initialize can get context in contained class' class method can get context in contained class' class method does includes args, instance vars, local variables and expressions on instance methods does includes args, instance vars, local variables and expressions on instance methods includes top level vars includes top level vars can get context of nested yielded block can get context of nested yielded block does includes regex special variables does includes regex special variables can display text output can display text output can get context of yielded block can get context of yielded block can't get context from uncalled method can't get context from uncalled method can get context in generic class can get context in generic class does not includes temp variables does not includes temp variables use type filters from if var use type filters from if var can get context of empty yielded block can get context of empty yielded block includes assignments includes assignments can get context of empty def can get context of empty def includes last call includes last call use type filters from is_a? use type filters from is_a? can get context inside a module can get context inside a module can get context inside class methods can get context inside class methods includes args includes args does includes self on classes does includes self on classes can get context in file private method can get context in file private method can display json output can display json output can handle union types can handle union types includes block args includes block args can get context in file private module can get context in file private module Semantic: return can use type var as return type (#1226) can use type var as return type (#1226) types bug (#1823) types bug (#1823) doesn't confuse return type from base class doesn't confuse return type from base class allows returning NoReturn instead of the wanted type allows returning NoReturn instead of the wanted type can use non-type free var in return type (#6543) can use non-type free var in return type (#6543) can use free var in return type (#2492) can use free var in return type (#2492) can use type var as return type with an inherited generic class can use type var as return type with an inherited generic class allows nilable return type to match subclasses (#1735) allows nilable return type to match subclasses (#1735) flattens splats inside multiple return values flattens splats inside multiple return values forms a tuple from multiple return values forms a tuple from multiple return values infers return type with many returns (1) infers return type with many returns (1) types return if true types return if true infers return type with many returns (2) infers return type with many returns (2) can use non-type free var in return type (2) (#6543) can use non-type free var in return type (2) (#6543) errors on return in top level errors on return in top level errors if non-type free var cannot be inferred errors if non-type free var cannot be inferred infers return type infers return type can use type var as return type with an included generic module can use type var as return type with an included generic module Semantic: ssa 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 inside an if without change in else types a var inside an if without change in else types a var that is re-assigned in a while in next and used in condition types a var that is re-assigned in a while in next and used in condition doesn't change type to nilable inside if doesn't change type to nilable inside if types a var after begin ensure as having last type types a var after begin ensure as having last type types while with break with new var types while with break with new var types a var that is re-assigned in a while condition types a var that is re-assigned in a while condition 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 redefined variable types a redefined variable doesn't error if same variable is declared in multiple typeofs doesn't error if same variable is declared in multiple typeofs doesn't error if same variable is used in multiple arguments of same typeof doesn't error if same variable is used in multiple arguments of same typeof types a var that is re-assigned in a while types a var that is re-assigned in a while 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 preserves type filters after block (bug) preserves type filters after block (bug) types a var after begin ensure as having last type (2) types a var after begin ensure as having last type (2) types a var inside an if without definition in then types a var inside an if without definition in then types block with break types block with break types if with break in then types if with break in then types a var inside an if without definition in else types a var inside an if without definition in else types if with return in then types if with return in then types a var with an if but without change types a var with an if but without change 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 while with break doesn't infect initial vars types while with break doesn't infect initial vars types if with next in then types if with next in then errors if accessing variable declared inside typeof errors if accessing variable declared inside typeof types while with next types while with next types if with unreachable in then types if with unreachable in then types a var that is re-assigned in a block types a var that is re-assigned in a block types if with restricted type in then types if with restricted type in then types a var that is declared in a while types a var that is declared in a while types re-assign inside while (bug) types re-assign inside while (bug) types if with return in else with assign types if with return in else with assign types block with next types block with next types if with return in both branches types if with return in both branches types if/else with var (bug) types if/else with var (bug) types 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 if with return in then with assign types if with return in then with assign types re-assign inside if (bug) types re-assign inside if (bug) types a var inside an if without previous definition types a var inside an if without previous definition types if with return in else types if with return in else types a var that is declared in a while condition types a var that is declared in a while condition types block with break doesn't infect initial vars types block with break doesn't infect initial vars types a var inside an if with previous definition types a var inside an if with previous definition types a var inside an if without change in then types a var inside an if without change in then types if with restricted type in else types if with restricted type in else Crystal::Config .host_target .host_target .linux_runtime_libc .linux_runtime_libc Crystal::Command::FormatCommand formats files formats files formats stdin (bug + show-backtrace) formats stdin (bug + show-backtrace) checks files format (excludes) checks files format (excludes) formats stdin formats stdin checks files format (ok) checks files format (ok) formats files (dir) formats files (dir) formats files (bug + show-stacktrace) formats files (bug + show-stacktrace) formats stdin (bug) formats stdin (bug) formats stdin (formatted) formats stdin (formatted) formats stdin (invalid byte sequence error) formats stdin (invalid byte sequence error) checks files format checks files format formats stdin (syntax error) formats stdin (syntax error) checks files format (excludes + includes) checks files format (excludes + includes) formats files (bug) formats files (bug) formats files (error) formats files (error) Crystal::Repl::Interpreter types discards class for non-union type discards class for non-union type discards crystal_type_id discards crystal_type_id discards .class discards .class interprets class_crystal_instance_type_id interprets class_crystal_instance_type_id discards generic discards generic interprets class for module type (#12203) interprets class for module type (#12203) discards typeof discards typeof interprets class for virtual_type type (struct) interprets class for virtual_type type (struct) interprets crystal_type_id for virtual metaclass type (#12228) interprets crystal_type_id for virtual metaclass type (#12228) interprets path to type interprets path to type interprets crystal_type_id for non-nil interprets crystal_type_id for non-nil discards class for virtual_type type discards class for virtual_type type interprets class for non-union type interprets class for non-union type interprets crystal_type_id for nil interprets crystal_type_id for nil does class method on virtual metaclass casted to generic metaclass (#12302) does class method on virtual metaclass casted to generic metaclass (#12302) discards Path discards Path interprets class for virtual_type type interprets class for virtual_type type Semantic: automatic cast casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) autocasts first argument and second matches without autocast autocasts first argument and second matches without autocast doesn't autocast number on union (#8655) doesn't autocast number on union (#8655) can use automatic cast with `with ... yield` (#7736) can use automatic cast with `with ... yield` (#7736) casts literal integer (Int64 -> Int32, too big) casts literal integer (Int64 -> Int32, too big) autocasts nested type from non-nested type (#10315) autocasts nested type from non-nested type (#10315) casts literal integer through alias with union casts literal integer through alias with union casts integer variable to larger type (Int64 to Int128) (#9565) casts integer variable to larger type (Int64 to Int128) (#9565) casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration doesn't cast integer variable to larger type (not #9565) doesn't cast integer variable to larger type (not #9565) doesn't do multidispatch if an overload matches exactly (#8217) doesn't do multidispatch if an overload matches exactly (#8217) says ambiguous call for integer on alias (#6620) says ambiguous call for integer on alias (#6620) casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) says ambiguous call on union (#8655) says ambiguous call on union (#8655) casts literal integer (Int32 -> no restriction) casts literal integer (Int32 -> no restriction) casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) autocasts float32 variable to float64 type (#9565) autocasts float32 variable to float64 type (#9565) casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment says ambiguous call for integer var to larger type (#9565) says ambiguous call for integer var to larger type (#9565) errors when autocast default value doesn't match enum member errors when autocast default value doesn't match enum member autocasts integer variable to float type (#9565) autocasts integer variable to float type (#9565) can autocast to union in default value (multiple enums) can autocast to union in default value (multiple enums) casts Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration says ambiguous call for integer var to union type (#9565) says ambiguous call for integer var to union type (#9565) can autocast to union in default value can autocast to union in default value casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment casts literal integer through alias with union casts literal integer through alias with union 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) casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration says ambiguous call for symbol says ambiguous call for symbol casts integer variable to larger type (#9565) casts integer variable to larger type (#9565) casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment can match multiple times with the same argument type (#7578) can match multiple times with the same argument type (#7578) casts symbol literal to enum casts symbol literal to enum doesn't do multidispatch if an overload matches exactly (#8217) doesn't do multidispatch if an overload matches exactly (#8217) 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) casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic matches correct overload matches correct overload 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) can autocast to alias in default value can autocast to alias in default value says ambiguous call for integer (2) says ambiguous call for integer (2) casts literal integer in private top-level method (#7016) casts literal integer in private top-level method (#7016) casts Symbol to Enum in cvar type declaration casts Symbol to Enum in cvar type declaration casts integer expression to larger type (#9565) casts integer expression to larger type (#9565) errors if symbol name doesn't match enum member errors if symbol name doesn't match enum member can autocast to union in default value (symbol and int) can autocast to union in default value (symbol and int) says ambiguous call for integer says ambiguous call for integer casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment Semantic: metaclass types metaclass superclass types metaclass superclass types Object class types Object class can't reopen as struct can't reopen as struct can't reopen as module can't reopen as module types Class class types Class class types Reference metaclass types Reference metaclass types generic instance metaclass superclass types generic instance metaclass superclass types generic module metaclass types generic module metaclass subtyping relations between metaclasses generic modules (3) generic modules (3) generic classes (3) generic classes (3) non-generic classes non-generic classes generic classes (2) generic classes (2) generic modules (1) generic modules (1) generic modules (2) generic modules (2) virtual metaclass type with virtual type (#12628) virtual metaclass type with virtual type (#12628) non-generic modules non-generic modules generic classes (1) generic classes (1) types Object and Class metaclasses types Object and Class metaclasses types generic class metaclass types generic class metaclass types generic metaclass superclass types generic metaclass superclass Semantic: sizeof types instance_sizeof NoReturn (missing type) (#5717) types instance_sizeof NoReturn (missing type) (#5717) gives error if using instance_sizeof on an abstract struct with multiple subtypes (#11855) gives error if using instance_sizeof on an abstract struct with multiple subtypes (#11855) gives error if using instance_sizeof on a metaclass gives error if using instance_sizeof on a metaclass gives error if using instance_sizeof on a struct gives error if using instance_sizeof on a struct gives error if using instance_sizeof on a module gives error if using instance_sizeof on a module types sizeof types sizeof types sizeof NoReturn (missing type) (#5717) types sizeof NoReturn (missing type) (#5717) gives error if using instance_sizeof on something that's not a class gives error if using instance_sizeof on something that's not a class types alignof types alignof types instance_sizeof types instance_sizeof gives error if using instance_sizeof on a union type (#8349) gives error if using instance_sizeof on a union type (#8349) types alignof NoReturn (missing type) (#5717) types alignof NoReturn (missing type) (#5717) types instance_alignof types instance_alignof errors on sizeof uninstantiated generic type (#6415) errors on sizeof uninstantiated generic type (#6415) gives error if using instance_sizeof on an abstract struct (#11855) gives error if using instance_sizeof on an abstract struct (#11855) gives error if using instance_sizeof on a generic type without type vars gives error if using instance_sizeof on a generic type without type vars types instance_alignof NoReturn (missing type) (#5717) types instance_alignof NoReturn (missing type) (#5717) Semantic: macro shows correct error message in macro expansion (#7083) shows correct error message in macro expansion (#7083) errors if named arg matches single splat parameter errors if named arg matches single splat parameter finds macro in inherited generic class finds macro in inherited generic class finds macro in module in Object finds macro in module in Object raise inside macro without node supports an empty message (#8631) supports an empty message (#8631) does not contain `expanding macro` does not contain `expanding macro` renders both frames (#7147) renders both frames (#7147) with node points to caller when missing node location information (#7147) points to caller when missing node location information (#7147) 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) inside method without node renders both frames (#7147) renders both frames (#7147) works inside proc literal (#2984) works inside proc literal (#2984) finds method before macro (#236) finds method before macro (#236) can lookup type parameter when macro is called inside class (#5343) can lookup type parameter when macro is called inside class (#5343) matches with default value after splat matches with default value after splat uses splat and double splat uses splat and double splat solves named macro expression arguments before macro expansion (type) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) allows subclasses of return type for macro def allows subclasses of return type for macro def assigns to underscore in MultiAssign assigns to underscore in MultiAssign evaluates yield expression (#2924) evaluates yield expression (#2924) errors if find macros but wrong arguments errors if find macros but wrong arguments can't define new variables (#466) can't define new variables (#466) errors if using macro that is defined later errors if using macro that is defined later can use macro in instance var initializer (#7666) can use macro in instance var initializer (#7666) errors if missing one argument errors if missing one argument solves macro expression arguments before macro expansion (type) solves macro expression arguments before macro expansion (type) allows generic return types for macro def allows generic return types for macro def finds generic type argument of included module with self finds generic type argument of included module with self can specify tuple as return type can specify tuple as return type show macro trace in errors (2) show macro trace in errors (2) errors if macro uses undefined variable errors if macro uses undefined variable declares variable for macro with out declares variable for macro with out executes MultiAssign with ArrayLiteral value executes MultiAssign with ArrayLiteral value allows declaring class with macro for allows declaring class with macro for allows named args after splat allows named args after splat can use macro in instance var initializer (just assignment) (#7666) can use macro in instance var initializer (just assignment) (#7666) can return class type in macro def can return class type in macro def finds macro and method at the same scope finds macro and method at the same scope errors when trying to define def inside def with macro expansion errors when trying to define def inside def with macro expansion double splat and regular args double splat and regular args errors if requires inside if through macro expansion errors if requires inside if through macro expansion declares rescue variable inside for macro declares rescue variable inside for macro errors if find macros but missing argument errors if find macros but missing argument errors if requires inside class through macro expansion errors if requires inside class through macro expansion allows declaring class with macro if allows declaring class with macro if errors if named arg matches splat parameter errors if named arg matches splat parameter finds macro and method at the same scope inside included module finds macro and method at the same scope inside included module checks if macro expansion returns (#821) checks if macro expansion returns (#821) solves macro expression arguments before macro expansion (constant) solves macro expression arguments before macro expansion (constant) @caller returns nil if no stack is available returns nil if no stack is available returns an array of each call returns an array of each call provides access to the `Call` information provides access to the `Call` information types macro def with argument types macro def with argument gets named arguments in double splat gets named arguments in double splat clones default value before expanding clones default value before expanding types macro def that calls another method types macro def that calls another method allows union return types for macro def allows union return types for macro def declares multi-assign vars for macro declares multi-assign vars for macro expands macro with break inside while (#1852) expands macro with break inside while (#1852) executes MultiAssign executes MultiAssign 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 says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat doesn't include parameters with default values in missing arguments error doesn't include parameters with default values in missing arguments error solves named macro expression arguments before macro expansion (constant) (#2423) solves named macro expression arguments before macro expansion (constant) (#2423) expands multiline macro expression in verbatim (#6643) expands multiline macro expression in verbatim (#6643) types macro def that calls another method inside a class types macro def that calls another method inside a class 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 show macro trace in errors (1) show macro trace in errors (1) can return virtual class type in macro def can return virtual class type in macro def finds generic in macro code using free var finds generic in macro code using free var finds free type vars finds free type vars executes OpAssign (#9356) executes OpAssign (#9356) assigns to underscore assigns to underscore types macro types macro allows specifying self as macro def return type allows specifying self as macro def return type errors if applying protected modifier to macro errors if applying protected modifier to macro types macro def types macro def can define constant via macro included can define constant via macro included applies visibility modifier only to first level applies visibility modifier only to first level errors if declares macro inside if errors if declares macro inside if finds generic type argument of included module finds generic type argument of included module finds generic in macro code finds generic in macro code allows declaring class with inline macro expression (#1333) allows declaring class with inline macro expression (#1333) finds var in proc for macros finds var in proc for macros doesn't crash on syntax error inside macro (regression, #8038) doesn't crash on syntax error inside macro (regression, #8038) errors if named arg already specified errors if named arg already specified errors if missing two arguments errors if missing two arguments looks up argument types in macro owner, not in subclass (#2395) looks up argument types in macro owner, not in subclass (#2395) expands macro with block expands macro with block errors if macro def type doesn't match found errors if macro def type doesn't match found finds macro in included module at class level (#4639) finds macro in included module at class level (#4639) gives precise location info when doing yield inside macro gives precise location info when doing yield inside macro uses bare *, doesn't let more args uses bare *, doesn't let more args doesn't error when adding macro call to constant (#2457) doesn't error when adding macro call to constant (#2457) cannot lookup type defined in caller class cannot lookup type defined in caller class does macro verbatim outside macro does macro verbatim outside macro uses bare * uses bare * can override macro (#2773) can override macro (#2773) expands macro with block and argument to yield expands macro with block and argument to yield errors if non-existent named arg errors if non-existent named arg finds metaclass instance of instance method (#4639) finds metaclass instance of instance method (#4639) finds macro in included module finds macro in included module types macro def that calls another method inside a class types macro def that calls another method inside a class has correct location after expanding assignment after instance var has correct location after expanding assignment after instance var unpacks block parameters inside macros (#13742) unpacks block parameters inside macros (#13742) unpacks to underscore within block parameters inside macros unpacks to underscore within block parameters inside macros 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) does macro verbatim inside macro does macro verbatim inside macro transforms with {{yield}} and call transforms with {{yield}} and call uses uninitialized variable with macros uses uninitialized variable with macros uses bare *, doesn't let more args uses bare *, doesn't let more args skip_file macro directive skips file inside an if macro expression skips file inside an if macro expression skips expanding the rest of the current file skips expanding the rest of the current file finds metaclass instance of instance method (#4739) finds metaclass instance of instance method (#4739) finds macro in included generic module finds macro in included generic module allows specifying self as macro def return type (2) allows specifying self as macro def return type (2) allows return values that include the return type of the macro def allows return values that include the return type of the macro def doesn't die on && inside if (bug) doesn't die on && inside if (bug) errors if macro def type not found errors if macro def type not found finds type for global path shared with free var finds type for global path shared with free var can access variable inside macro expansion (#2057) can access variable inside macro expansion (#2057) finds macro through alias (#2706) finds macro through alias (#2706) Crystal::Repl::Interpreter special vars does special var that's a reference does special var that's a reference sets special var inside call inside block (#12250) sets special var inside call inside block (#12250) 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 Code gen: not codegens not true codegens not true codegens not nilable type (true) codegens not nilable type (true) doesn't crash doesn't crash codegens not pointer (true) codegens not pointer (true) codegens not with inlinable value (#6451) codegens not with inlinable value (#6451) codegens not number codegens not number codegens not pointer (false) codegens not pointer (false) codegens not nilable type (false) codegens not nilable type (false) codegens not nil codegens not nil codegens not false codegens not false Code gen: exception 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 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 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) 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 doesn't codegen duplicated ensure if unreachable (#709) doesn't codegen duplicated ensure if unreachable (#709) runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 runs #2441 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 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 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) 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 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 codegens issue #118 (2) codegens issue #118 (2) handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass handles subclass 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) 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) 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 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 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 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 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) 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 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) 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) 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 codegens issue #118 (1) codegens issue #118 (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 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) 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) 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 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 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) 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 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) 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) 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 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) 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 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 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 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 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 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 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 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) closures rescue variable (#8141) closures rescue variable (#8141) 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 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 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) 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) 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 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 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, 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) 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 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 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) 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) 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) 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 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 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 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 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) 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) 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 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) 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) 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) 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 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 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 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 Crystal::Repl::Interpreter calls does call on instance var that's a struct, from a class does call on instance var that's a struct, from a class inlines method that just reads an instance var (2) inlines method that just reads an instance var (2) does call with struct as obj does call with struct as obj puts struct pointer after tuple indexer puts struct pointer after tuple indexer does call on Pointer#value that's a struct, takes a pointer to instance var does call on Pointer#value that's a struct, takes a pointer to instance var does call on var that's a struct, takes a pointer to instance var, inside if does call on var that's a struct, takes a pointer to instance var, inside if does call on 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 discards call with struct as obj discards call with struct as obj mutates through pointer (3) mutates through pointer (3) interprets explicit self call for primitive types interprets explicit self call for primitive types 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 ReadInstanceVar with wants_struct_pointer does ReadInstanceVar with wants_struct_pointer does call on read instance var that's a struct, takes a pointer to instance var does call on read instance var that's a struct, takes a pointer to instance var interprets call with if interprets call with if 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 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 does Assign var with wants_struct_pointer does Assign var with wants_struct_pointer interprets call with named arguments interprets call with named arguments mutates call argument mutates call argument calls a top-level method without arguments and no local vars calls a top-level method without arguments and no local vars interprets self for primitive types interprets self for primitive types inlines call that returns self inlines call that returns self does call on instance var that's a struct, from a struct does call on instance var that's a struct, from a struct does call with struct as obj (2) does call with struct as obj (2) mutates through inlined instance var without receiver mutates through inlined instance var without receiver calls a top-level method without arguments but with local vars calls a top-level method without arguments but with local vars 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 Assign instance var with wants_struct_pointer does Assign instance var with wants_struct_pointer interprets call with default values interprets call with default values inlines method that just reads an instance var inlines method that just reads an instance var mutates through inlined instance var with receiver mutates through inlined instance var with receiver calls a top-level method with two arguments calls a top-level method with two arguments mutates through read instance var mutates through read instance var mutates through pointer (2) mutates through pointer (2) does Assign class var with wants_struct_pointer does Assign class var with wants_struct_pointer interprets implicit self call for pointer interprets implicit self call for pointer mutates through pointer (1) mutates through pointer (1) inlines call that returns self (2) inlines call that returns self (2) Semantic: offsetof gives error if using offsetof on Tuples with instance variables gives error if using offsetof on Tuples with instance variables errors on typeof inside offsetof expression errors on typeof inside offsetof expression types offsetof types offsetof gives error if using offsetof on non-Tuples with an index gives error if using offsetof on non-Tuples with an index errors on undefined instance variable errors on undefined instance variable can be used with classes can be used with classes can be used with generic types can be used with generic types gives error if using offsetof on Tuples with negative indexes gives error if using offsetof on Tuples with negative indexes errors on offsetof element of uninstantiated generic type errors on offsetof element of uninstantiated generic type 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 something that can't have instance variables gives error if using offsetof on something that can't have instance variables gives error if using offsetof on something that's neither a class, a struct nor a Tuple gives error if using offsetof on something that's neither a class, a struct nor a Tuple Code gen: proc saves receiver value of proc pointer `->@ivar.foo` saves receiver value of proc pointer `->@ivar.foo` 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) allows invoking proc literal with smaller type allows invoking proc literal with smaller type takes pointerof function pointer takes pointerof function pointer call simple proc literal call simple proc literal call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises call proc pointer of instance method that raises allows redefining fun allows redefining fun codegens proc with union type that returns itself codegens proc with union type that returns itself call proc literal with arguments call proc literal with arguments automatically casts proc that returns something to proc that returns void automatically casts proc that returns something to proc that returns void closures var on ->var.call (#8584) closures var on ->var.call (#8584) gets proc pointer using virtual type (#1337) gets proc pointer using virtual type (#1337) allows invoking a function with a subtype allows invoking a function with a subtype does new on proc type does new on proc type codegens proc in instance var initialize (#3016) codegens proc in instance var initialize (#3016) 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 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) call simple proc literal with return call simple proc literal with return codegens nilable proc type dispatch (2) codegens nilable proc type dispatch (2) can assign proc that returns anything to proc that returns nil (#3655) can assign proc that returns anything to proc that returns nil (#3655) doesn't crash on #2196 doesn't crash on #2196 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) binds function pointer to associated call binds function pointer to associated call allows proc type of enum type with base type allows proc type of enum type with base type call proc literal with return type call proc literal with return type codegens proc that references struct (bug) codegens proc that references struct (bug) executes proc pointer on primitive executes proc pointer on primitive 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 issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens issue with missing byval in proc literal inside struct codegens proc of generic type codegens proc of generic type gets proc to lib fun (#504) gets proc to lib fun (#504) codegens nilable proc type (1) codegens nilable proc type (1) can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) allows invoking a function with a subtype when defined as block spec allows invoking a function with a subtype when defined as block spec allows proc type of enum type allows proc type of enum type 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 codegens proc that returns a virtual type codegens proc that returns a virtual type call proc pointer of instance method call proc pointer of instance method allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable allows proc pointer where self is a class allows proc pointer where self is a class casts from function pointer to proc casts from function pointer to proc 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) saves receiver value of proc pointer `->var.foo` saves receiver value of proc pointer `->var.foo` calls proc pointer with union (passed by value) arg calls proc pointer with union (passed by value) arg call proc pointer call proc pointer codegens captured block that returns tuple codegens captured block that returns tuple allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically allows passing proc type to C automatically codegens nilable proc type (2) codegens nilable proc type (2) passes proc as &->expr to method that yields passes proc as &->expr to method that yields codegens nilable proc type dispatch (1) codegens nilable proc type dispatch (1) builds proc type from fun builds proc type from fun assigns nil and proc to nilable proc type assigns nil and proc to nilable proc type doesn't crash when taking a proc pointer that multidispatches on a module (#3822) doesn't crash when taking a proc pointer that multidispatches on a module (#3822) 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` builds nilable proc type from fun builds nilable proc type from fun accesses T in macros as a TupleLiteral accesses T in macros as a TupleLiteral codegens proc with another var codegens proc with another var call proc pointer with args call proc pointer with args 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 to a virtual type (#9823) doesn't crash when taking a proc pointer to a virtual type (#9823) returns proc as function pointer inside top-level fun (#14691) returns proc as function pointer inside top-level fun (#14691) returns ProcPointer inside top-level fun (#14691) returns ProcPointer inside top-level fun (#14691) doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) doesn't crash when taking a proc pointer that multidispatches on the top-level (#3822) codegens 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) 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) 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) Normalize: or normalizes or with ! on var.is_a?(...) normalizes or with ! on var.is_a?(...) normalizes or with ! on var normalizes or with ! on var normalizes or with assignment on the left normalizes or with assignment on the left normalizes or without variable normalizes or without variable normalizes or with is_a? on var normalizes or with is_a? on var normalizes or with variable on the left normalizes or with variable on the left Normalize: op assign normalizes exp[0] += normalizes exp[0] += normalizes @var.value += normalizes @var.value += normalizes var -= normalizes var -= normalizes exp.value ||= normalizes exp.value ||= 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 var[0] += normalizes var[0] += normalizes var &+= normalizes var &+= normalizes exp[value] += normalizes exp[value] += normalizes var ||= normalizes var ||= normalizes @var[0] += normalizes @var[0] += normalizes var += normalizes var += normalizes @@var.value += normalizes @@var.value += normalizes var &&= normalizes var &&= normalizes var &*= normalizes var &*= normalizes exp[value] ||= normalizes exp[value] ||= normalizes exp.value += normalizes exp.value += normalizes var &-= normalizes var &-= Lexer macro lexes macro with if after assign lexes macro with if after assign lexes macro with embedded string with %( lexes macro with embedded string with %( doesn't lex macro var if escaped doesn't lex macro var if escaped keeps correct column and line numbers keeps correct column and line numbers lexes macro with nested unless lexes macro with nested unless lexes macro with if as suffix lexes macro with if as suffix lexes macro with nested class lexes macro with nested class lexes macro with nested case lexes macro with nested case lexes macro with comments and expressions lexes macro with comments and expressions lexes macro with nested struct lexes macro with nested struct lexes macro with embedded char and sharp lexes macro with embedded char and sharp lexes macro with nested embedded string with %( lexes macro with nested embedded string with %( lexes macro with embedded string with %[ ignores begin lexes macro with embedded string with %[ ignores begin skips whitespace skips whitespace lexes macro with comments lexes macro with comments lexes with for inside escaped macro (#1029) lexes with for inside escaped macro (#1029) lexes macro with embedded string and backslash lexes macro with embedded string and backslash lexes macro with embedded string lexes macro with embedded string lexes macro with embedded string with %[ lexes macro with embedded string with %[ lexes macro with nested enum lexes macro with nested enum reaches end reaches end lexes simple macro lexes simple macro lexes macro with nested abstract struct lexes macro with nested abstract struct lexes macro with nested begin lexes macro with nested begin lexes macro with nested do lexes macro with nested do lexes macro with control lexes macro with control lexes with unless inside escaped macro (#5664) lexes with unless inside escaped macro (#5664) lexes macro var lexes macro var lexes macro with if as suffix after return lexes macro with if as suffix after return lexes macro with nested fun lexes macro with nested fun 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 escaped quote inside string (#895) lexes escaped quote inside string (#895) lexes begin end lexes begin end lexes macro with embedded string with %< lexes macro with embedded string with %< lexes with if/end inside escaped macro (#1029) lexes with if/end inside escaped macro (#1029) lexes macro with nested union lexes macro with nested union lexes macro with nested annotation lexes macro with nested annotation lexes macro with nested if lexes macro with nested if 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 macro with embedded string with %( ignores begin lexes macro with embedded string with %( ignores begin lexes macro with nested abstract class lexes macro with nested abstract class lexes macro with expression lexes macro with expression lexes macro with nested module lexes macro with nested module lexes macro with curly escape lexes macro with curly escape lexes macro with nested lib lexes macro with nested lib lexes macro with curly escape in comment lexes macro with curly escape in comment lexes macro with nested macro lexes macro with nested macro lexes macro with embedded string with %< ignores begin lexes macro with embedded string with %< ignores begin lexes macro with slash not followed by curly lexes macro with slash not followed by curly lexes macro with nested def lexes macro with nested def lexes macro with nested while lexes macro with nested while lexes macro with nested until lexes macro with nested until lexes macro without nested if lexes macro without nested if lexes macro with semicolon before end lexes macro with semicolon before end lexes macro with nested abstract def lexes macro with nested abstract def lexes bug #654 lexes bug #654 lexes macro with nested select lexes macro with nested select Semantic: def reports no overload matches reports no overload matches uses free variable uses free variable uses free variable as block return type uses free variable as block return type uses free variable and doesn't conflict with top-level type uses free variable and doesn't conflict with top-level type errors when default value is incompatible with type restriction errors when default value is incompatible with type restriction errors if return type doesn't match on instance method errors if return type doesn't match on instance method says can only defined def on types and self says can only defined def on types and self shows free variables if no overload matches shows free variables if no overload matches types a call with a double types a call with a double errors when calling two functions with nil type errors when calling two functions with nil type do not use body for the def type do not use body for the def type types a call with an argument types a call with an argument 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) types getchar with Char types getchar with Char errors if declares def inside if errors if declares def inside if 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) uses free variable with metaclass and default value uses free variable with metaclass and default value uses free variable with metaclass uses free variable with metaclass says compile-time type on error says compile-time type on error defines class method defines class method points error at name (#6937) points error at name (#6937) types mutual infinite recursion types mutual infinite recursion errors when default value is incompatible with non-type restriction errors when default value is incompatible with non-type restriction lookups methods in super modules lookups methods in super modules reports no block given reports no block given doesn't find type in namespace through free var doesn't find type in namespace through free var is ok if returns Int32? with explicit return is ok if returns Int32? with explicit return types a call with an int types a call with an int types a call with an argument uses a new scope types a call with an argument uses a new scope types call with union argument types call with union argument errors if return type doesn't match on class method errors if return type doesn't match on class method allows recursion with arg allows recursion with arg types simple recursion 2 types simple recursion 2 types mutual recursion types mutual recursion calls with default argument calls with default argument clones regex literal value (#2384) clones regex literal value (#2384) accesses free var of default argument (#1101) accesses free var of default argument (#1101) errors if trying to declare method on generic class instance errors if trying to declare method on generic class instance types empty body def types empty body def assigns def owner assigns def owner defines class method with self defines class method with self reports block given reports block given reports no overload matches 2 reports no overload matches 2 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 gives correct error for methods in Class errors if return type doesn't match errors if return type doesn't match allows recursion allows recursion types putchar with Char types putchar with Char types a call with an argument types a call with an argument can't use self in toplevel method can't use self in toplevel method types a call with a float types a call with a float types call with global scope types call with global scope gives correct error for methods in Class (2) gives correct error for methods in Class (2) Crystal::Init::InitProject has proper contents has proper contents correctly uses git config correctly uses git config Parser warnings warns on suffix-less UInt64 literals > Int64::MAX warns on suffix-less UInt64 literals > Int64::MAX warns on missing space before colon in block param type restriction in block param type restriction in return type restriction in return type restriction in type declaration in type declaration in anonymous block param type restriction in anonymous block param type restriction Code gen: C ABI x86_64 passes struct less than 64 bits as { i64 } in varargs passes struct less than 64 bits as { i64 } in varargs returns struct less than 64 bits as { i64 } returns struct less than 64 bits as { i64 } returns struct between 64 and 128 bits as { i64, i64 } returns struct between 64 and 128 bits as { i64, i64 } passes struct bigger than128 bits with byval passes struct bigger than128 bits with byval passes struct between 64 and 128 bits as { i64, i64 } (with multiple modules/contexts) passes struct between 64 and 128 bits as { i64, i64 } (with multiple modules/contexts) returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret passes struct between 64 and 128 bits as { i64, i64 } passes struct between 64 and 128 bits as { i64, i64 } passes struct less than 64 bits as { i64 } passes struct less than 64 bits as { i64 } Code gen: and codegens and with bool union as left node 2 codegens and with bool union as left node 2 codegens and with nilable as left node 1 codegens and with nilable 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 union as left node 4 codegens and with bool union as left node 4 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 nilable as left node 2 codegens and with nilable as left node 2 codegens and with bool false and true codegens and with bool false and true 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 2 codegens and with bool union 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 primitive type other than bool with union codegens and with primitive type other than bool with union codegens and with bool union as left node 1 codegens and with bool union as left node 1 codegens assign in right node, after must be nilable codegens assign in right node, after must be nilable codegens and with bool and int 1 codegens and with bool and int 1 codegens and with bool false and false codegens and with bool false and false codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with bool and int 2 codegens and with bool and int 2 codegens and with nil union as left node 2 codegens and with nil union as left node 2 codegens assign in right node, after if must be nilable codegens assign in right node, after if must be nilable codegens and with non-false union as left node codegens and with non-false union as left node codegens and with bool true and false codegens and with bool true and false codegens and with primitive type other than bool codegens and with primitive type other than bool codegens and with bool union as left node 3 codegens and with bool union as left node 3 codegens and with bool true and true codegens and with bool true and true Crystal::Repl::Interpreter variadic calls promotes int promotes int promotes float promotes float promotes enum promotes enum command expansion expands ldflags expands ldflags Normalize: return next break removes nodes after next removes nodes after next removes nodes after break removes nodes after break 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 Code gen: op assign evaluates exps once (#3398) evaluates exps once (#3398) evaluates exps once, [] (#3398) evaluates exps once, [] (#3398) Semantic: not types not types not filters types inside if filters types inside if types not as NoReturn if exp is NoReturn types not as NoReturn if exp is NoReturn doesn't restrict and doesn't restrict and filters types with !is_a? filters types with !is_a? doesn't restrict and in while (#4243) doesn't restrict and in while (#4243) filters types inside if/else filters types inside if/else Semantic: c enum types enum value types enum value types enum value with base type types enum value with base type errors if enum base type is not an integer errors if enum base type is not an integer allows using an enum as a type in a fun allows using an enum as a type in a fun errors if enum value is different from default (Int32) (#194) errors if enum value is different from default (Int32) (#194) allows using an enum as a type in a struct allows using an enum as a type in a struct Code gen: primitives codegens crystal_type_id with union type codegens crystal_type_id with union type codegens char codegens char codegens crystal_type_id for class codegens crystal_type_id for class codegens long codegens long allows @[Primitive] on method that has body allows @[Primitive] on method that has body atomicrmw codegens atomicrmw with symbols codegens atomicrmw with symbols codegens atomicrmw with enums codegens atomicrmw with enums codegens atomicrmw with enums codegens atomicrmw with enums codegens pointer of int codegens pointer of int codegens __LINE__ codegens __LINE__ allows redefining a primitive method allows redefining a primitive method can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) uses built-in llvm function that returns a tuple uses built-in llvm function that returns a tuple codegens f32 codegens f32 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 codegens int128 allows @[Primitive] on fun declarations allows @[Primitive] on fun declarations codegens char ord codegens char ord codegens f64 codegens f64 doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) doesn't treat `(1 == 1) == true` as `1 == 1 == true` (#328) codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 codegens uint128 arithmetic primitives codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 2 * 3 codegens 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.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1.to_i16 codegens 1 &+ 2 codegens 1 &+ 2 codegens 1 - 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.to_f! codegens 1.to_f! codegens 1.to_i16! codegens 1.to_i16! codegens 8.unsafe_mod 3 codegens 8.unsafe_mod 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 8.unsafe_div 3 codegens 8.unsafe_div 3 codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1.to_f codegens 1 &- 2 codegens 1 &- 2 codegens 16.unsafe_shl 2 codegens 16.unsafe_shl 2 codegens 16.unsafe_shr 2 codegens 16.unsafe_shr 2 gets crystal class instance type id gets crystal class instance type id codegens int codegens int can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) sums two numbers out of an [] of Number sums two numbers out of an [] of Number va_arg works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code works with C code uses llvm's va_arg instruction uses llvm's va_arg instruction defined method that calls primitive (bug) defined method that calls primitive (bug) codegens bool codegens bool codegens string codegens string passes issue #328 passes issue #328 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) Codegen: const 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 support constant inside a def support constant inside a def supports storing function returning nil supports storing function returning nil initializes simple const initializes simple const 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 allows constants with same name allows constants with same name supports closured vars inside initializers (#10474) supports closured vars inside initializers (#10474) 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 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 const with math inlines const with math define a constant in lib define a constant in lib 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) 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 uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) inlines const referencing another const inlines const referencing another const uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module uses const before declaring it in another module support nested constant support nested constant 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 finds nearest constant first finds nearest constant first initializes ARGC_UNSAFE initializes ARGC_UNSAFE inlines simple const inlines simple const define a constant define a constant declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order declare constants in right order 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 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 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 initializes simple const via another const initializes simple const via another const inlines enum value inlines enum value codegens constant that is declared later because of virtual dispatch codegens constant that is declared later because of virtual dispatch 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 inlines bool const inlines bool 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) constants with expression constants with expression inlines char const inlines char 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 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 finds global constant finds global constant Crystal::TablePrint aligns columns borders aligns columns borders multiple rows with separator multiple rows with separator single row with separator single row with separator single cell single cell colspan a cell that fits the available size colspan a cell that fits the available size rows with horizontal separators rows with horizontal separators aligns cell content aligns cell content Semantic: nilable instance var says instance var was not initialized in all of the initialize methods, with var declaration says instance var was not initialized in all of the initialize methods, with var declaration says instance var was not initialized in all of the initialize methods (2) says instance var was not initialized in all of the initialize methods (2) says instance var was not initialized in all of the initialize methods says instance var was not initialized in all of the initialize methods doesn't consider as nil if initialized with catch-all doesn't consider as nil if initialized with catch-all marks instance var as nilable if assigned inside proc literal marks instance var as nilable if assigned inside proc literal says instance var was used before initialized says instance var was used before initialized says instance var was used before initialized (2) says instance var was used before initialized (2) says self was used before instance var was initialized says self was used before instance var was initialized marks instance var as nilable if assigned inside captured block (#1696) marks instance var as nilable if assigned inside captured block (#1696) says self was used before instance var was initialized (3) says self was used before instance var was initialized (3) says self was used before instance var was initialized (2) says self was used before instance var was initialized (2) finds type that doesn't initialize instance var (#1222) finds type that doesn't initialize instance var (#1222) Semantic: nil restricts type of 'if foo' restricts type of 'if foo' can call a fun with nil for typedef pointer can call a fun with nil for typedef pointer restricts type of 'while foo' on assign restricts type of 'while foo' on assign marks instance variables as nil when not in initialize marks instance variables as nil when not in initialize types empty types empty doesn't check return type for void doesn't check return type for void restricts type of 'while foo' restricts type of 'while foo' marks instance variables as nil when not in initialize 2 marks instance variables as nil when not in initialize 2 marks instance variables as nil but doesn't explode on macros marks instance variables as nil but doesn't explode on macros types nil types nil restricts type of 'if foo' on assign restricts type of 'if foo' on assign 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 Code gen: experimental errors if invalid argument type errors if invalid argument type compiles with no argument compiles with no argument errors if missing link arguments errors if missing link arguments errors if too many arguments errors if too many arguments compiles with single string argument compiles with single string argument Code gen: cast sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment sidecasts from union to union with different alignment can cast to metaclass (#11121) can cast to metaclass (#11121) casts to bigger union casts to bigger union casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment upcasts from union to union with different alignment allows casting nilable type to Void* (3) allows casting nilable type to Void* (3) casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts to module casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError casts from union to another union raises TypeCastError upcasts type to virtual (#3304) upcasts type to virtual (#3304) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment downcasts from union to union with different alignment casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts from union to single type casts to base class making it virtual casts to base class making it virtual upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) upcasts from non-generic to generic upcasts from non-generic to generic casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts between union types, where union has a tuple type (#3377) casts between union types, where union has a tuple type (#3377) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) casts (bug) allows casting nilable type to Void* (1) allows casting nilable type to Void* (1) casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from virtual to single type casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError allows casting nilable type to Void* (2) allows casting nilable type to Void* (2) casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from int to int casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union casts from union to another union allows casting object to pointer and back allows casting object to pointer and back can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) allows casting nil to Void* allows casting nil to Void* cast virtual metaclass type to nilable virtual instance type (#12628) cast virtual metaclass type to nilable virtual instance type (#12628) doesn't corrupt stack when downcasting union to union with different alignment (#14285) doesn't corrupt stack when downcasting union to union with different alignment (#14285) casts with block var that changes type (#3341) casts with block var that changes type (#3341) codegens class method when type id is available but not a virtual type (#3490) codegens class method when type id is available but not a virtual type (#3490) Semantic: concrete_types VirtualMetaclassType with abstract base VirtualMetaclassType with abstract base GenericModuleInstanceType GenericModuleInstanceType VirtualType with abstract base VirtualType with abstract base ModuleType ModuleType VirtualType with concrete base VirtualType with concrete base VirtualMetaclassType with concrete base VirtualMetaclassType with concrete base UnionType of structs UnionType of structs Crystal::Command clear_cache clears any cached compiler files clears any cached compiler files Semantic: hooks does included macro for generic module does included macro for generic module errors if wrong extended params length errors if wrong extended params length does extended macro does extended macro errors if wrong included params size errors if wrong included params size does added method macro does added method macro does inherited macro for generic class does inherited macro for generic class errors if wrong inherited params size errors if wrong inherited params size does included macro does included macro does inherited macro through generic instance type (#9693) does inherited macro through generic instance type (#9693) errors if wrong finished params length errors if wrong finished params length types initializer in inherited types initializer in inherited errors if wrong extended params size errors if wrong extended params size types macro finished hook bug regarding initialize (#3964) types macro finished hook bug regarding initialize (#3964) does not invoke 'method_added' hook recursively does not invoke 'method_added' hook recursively does inherited macro does inherited macro includes error message in included hook (#889) includes error message in included hook (#889) Semantic: external/internal macros can call with external name and use with internal can call with external name and use with internal can call positionally can call positionally can call with external name and use with internal, after splat can call with external name and use with internal, after splat overloads based on external name (#2610) overloads based on external name (#2610) can call with external name and use with internal can call with external name and use with internal can call with external name and use with internal, after splat can call with external name and use with internal, after splat can call positionally can call positionally Semantic: c union errors if using void via typedef in union field type errors if using void via typedef in union field type types union setter via pointer types union setter via pointer types Union#new types Union#new errors if setting closure errors if setting closure types union getter types union getter types union getter via pointer types union getter via pointer types c union types c union errors if using void in union field type errors if using void in union field type errors on empty c union (#633) errors on empty c union (#633) types union setter types union setter Semantic: instance var declares instance var of generic type, with no type parameter declares instance var of generic type, with no type parameter doesn't error if not calling super but initializing all variables doesn't error if not calling super but initializing all variables 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 declares with `self` declares with `self` doesn't infer type to be nilable if using self.class doesn't infer type to be nilable if using self.class doesn't complain if not initialized in one initialize, but has initializer (#2465) doesn't complain if not initialized in one initialize, but has initializer (#2465) can't infer type when using operation on const (#4054) can't infer type when using operation on const (#4054) 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 can't infer type from initializer in non-generic module can't infer type from initializer in non-generic module doesn't error if not initializing variables but calling previous_def (#3210) doesn't error if not initializing variables but calling previous_def (#3210) infers from another instance var infers from another instance var infers type from ||= inside another assignment infers type from ||= inside another assignment 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) declares instance var of generic module from non-generic module declares instance var of generic module from non-generic module guesses from splat (2) (#3149) guesses from splat (2) (#3149) infers type for generic class, with literal infers type for generic class, with literal guesses from new on abstract class guesses from new on abstract class infers type to be nilable if not initialized infers type to be nilable if not initialized errors when typing an instance variable inside a method errors when typing an instance variable inside a method 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 declares instance var of generic type, with virtual metaclass declares instance var of generic type, with virtual metaclass errors if declaring var in Object errors if declaring var in Object 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 custom generic hash literal infers type from custom generic hash literal infers type from lib out (2) infers type from lib out (2) shouldn't error when accessing instance var in initialized that's always initialized (#2953) shouldn't error when accessing instance var in initialized that's always initialized (#2953) infers from method on integer literal, with type annotation infers from method on integer literal, with type annotation errors if declaring var in NamedTuple(T) errors if declaring var in NamedTuple(T) infers type from path that is a type infers type from path that is a type declares instance var of generic type, with generic type declares instance var of generic type, with generic type infer from class method with multiple statements and return infer from class method with multiple statements and return declares instance var multiple times, last one wins declares instance var multiple times, last one wins looks up return type restriction in defining type, not instantiated type (#11961) looks up return type restriction in defining type, not instantiated type (#11961) can't infer type from initializer in generic class type can't infer type from initializer in generic class type cannot guess type from argument assigned in body cannot guess type from argument assigned in body doesn't solve instance var initializer in instance context (1) (#5876) doesn't solve instance var initializer in instance context (1) (#5876) infers type from as infers type from as doesn't infer from class method with multiple statements and return, on non-easy return (2) doesn't infer from class method with multiple statements and return, on non-easy return (2) infers from restriction using virtual type infers from restriction using virtual type 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 for subclass if assigns another type (2) doesn't infer for subclass if assigns another type (2) declares instance var of generic type, with splat declares instance var of generic type, with splat doesn't error if not initialized in macro def but outside it doesn't error if not initialized in macro def but outside it declares instance var of generic module (2) declares instance var of generic module (2) declares instance var of generic type, with tuple declares instance var of generic type, with tuple guesses from as.(typeof(...)) in generic type guesses from as.(typeof(...)) in generic type infers type from hash literal with of infers type from hash literal with of infers from another instance var in generic type with type declaration infers from another instance var in generic type with type declaration can't infer type from initializer can't infer type from initializer solves instance var initializer in metaclass context (#5876) solves instance var initializer in metaclass context (#5876) can declare type even if included module has a guessed var can declare type even if included module has a guessed var infers type from argument restriction infers type from argument restriction can't infer type of generic method that returns self (#5383) can't infer type of generic method that returns self (#5383) infers type from custom array literal in generic infers type from custom array literal in generic infers type for generic class, with lib call infers type for generic class, with lib call 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 argument default value infers type from argument default value instance variables initializers are used in class variables initialized objects (#3988) instance variables initializers are used in class variables initialized objects (#3988) doesn't solve instance var initializer in instance context (2) (#5876) doesn't solve instance var initializer in instance context (2) (#5876) errors when using Class in generic type errors when using Class in generic type doesn't error if uses typeof(@var) doesn't error if uses typeof(@var) 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 range literal infers type from range literal infers type from array literal in generic type infers type from array literal in generic type transfers initializer from generic module to class transfers initializer from generic module to class 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 infers from generic class method that has type annotation infers from generic class method that has type annotation declares instance var with initial value, with subclass declares instance var with initial value, with subclass infers type from offsetof infers type from offsetof infers type from responds_to? infers type from responds_to? infers type from self as virtual type (#2575) infers type from self as virtual type (#2575) cannot guess the type from splat argument with not splatted type cannot guess the type from splat argument with not splatted type doesn't infer generic type without type argument inside generic doesn't infer generic type without type argument inside generic infers type for generic module infers type for generic module doesn't error if initializes via super in macro def doesn't error if initializes via super in macro def infers type from included module recursively infers type from included module recursively errors if declaring instance var and turns out to be nilable errors if declaring instance var and turns out to be nilable infers from new with return type returning generic infers from new with return type returning generic infers type from sizeof infers type from sizeof guesses from as.(typeof(...)) guesses from as.(typeof(...)) declares instance var of generic type, with splat inside Tuple declares instance var of generic type, with splat inside Tuple infers from Pointer.null infers from Pointer.null infers type from ! infers type from ! guesses from splat (#3149) guesses from splat (#3149) infers type from number literal infers type from number literal infers type from named tuple literal infers type from named tuple literal infers type from array literal from its literals infers type from array literal from its literals errors if declaring variable with number errors if declaring variable with number 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 custom hash literal infers type from custom hash literal infers type from custom array literal infers type from custom array literal infers type from char literal infers type from char literal infers type from path that is a constant infers type from path that is a constant declares instance var with union type with a virtual member declares instance var with union type with a virtual member guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) infers type from array literal with literals in generic type infers type from array literal with literals in generic type declares instance var of generic type, with splat inside Proc declares instance var of generic type, with splat inside Proc 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) doesn't combine union of Number and Number subclass (#5073) doesn't combine union of Number and Number subclass (#5073) is more permissive with macro def initialize, other initialize is more permissive with macro def initialize, other initialize infers type from included module infers type from included module 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 from class method that has type annotation, with overload infers from class method that has type annotation, with overload infers type to be non-nilable if initialized in all initialize infers type to be non-nilable if initialized in all initialize doesn't crash on recursive method call doesn't crash on recursive method call infers type from two literals infers type from two literals doesn't error if not initializing variables but calling super for module doesn't error if not initializing variables but calling super for module declares instance var with self, on generic declares instance var with self, on generic declares instance var declares instance var infers type from all call matches infers type from all call matches uses virtual types in fun uses virtual types in fun errors if declaring var in Class errors if declaring var in Class declares instance var of generic class declares instance var of generic class declares instance var of generic type, with metaclass declares instance var of generic type, with metaclass declares as named tuple declares as named tuple doesn't complain in second part of #2575 doesn't complain in second part of #2575 infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) infers from Pointer.malloc with two arguments in generic type infers from Pointer.malloc with two arguments in generic type errors if adds instance variable to Object via guess errors if adds instance variable to Object via guess 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 regex literal with interpolation infers type from regex literal with interpolation errors when redeclaring subclass variable with a different type errors when redeclaring subclass variable with a different type 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) can type ivar from module included by generic class (#5281) can type ivar from module included by generic class (#5281) uses T.new (#4291) uses T.new (#4291) infers from Pointer.malloc in generic type infers from Pointer.malloc in generic type errors if declaring var in Int errors if declaring var in Int says can't infer type if only nil was assigned says can't infer type if only nil was assigned infers from another instance var in generic type infers from another instance var in generic type errors if declaring var in Tuple(*T) errors if declaring var in Tuple(*T) 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 from another instance var with type declaration infers from another instance var with type declaration declares instance var of generic type, with proc declares instance var of generic type, with proc errors if not initializing super variables (2) errors if not initializing super variables (2) infers type for generic class, with if infers type for generic class, with if doesn't infer type from redefined method doesn't infer type from redefined method infers type from enum member infers type from enum member infers type from lib fun call infers type from lib fun call can guess the type from double-splat argument with double-splatted type variable can guess the type from double-splat argument with double-splatted type variable infers type from as? infers type from as? infers type from || infers type from || infers type from proc literal with return type infers type from proc literal with return type infers type from self (#2575) infers type from self (#2575) infers type from symbol literal infers type from symbol literal doesn't infer for subclass if assigns another type (1) doesn't infer for subclass if assigns another type (1) guesses virtual hash type (1) (#5342) guesses virtual hash type (1) (#5342) guesses virtual array type (1) (#5342) guesses virtual array type (1) (#5342) infers type for generic class, with T.new and literal infers type for generic class, with T.new and literal infers type from assign (2) infers type from assign (2) infers from class method that has type annotation, in generic class infers from class method that has type annotation, in generic class infers type for generic class, with T.new infers type for generic class, with T.new infers type from custom hash literal in generic infers type from custom hash literal in generic doesn't error if not initializing variables but calling previous_def (2) (#3210) doesn't error if not initializing variables but calling previous_def (2) (#3210) infers from generic class method that has type annotation, without instantiating infers from generic class method that has type annotation, without instantiating errors if declaring var in Union(*T) errors if declaring var in Union(*T) can't infer type from initializer in generic module type can't infer type from initializer in generic module 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 says undefined instance variable on read says undefined instance variable on read guesses inside macro expression guesses inside macro expression infers nilable instance var of generic module infers nilable instance var of generic module 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 guesses inside macro if guesses inside macro if infers type from literal outside def with initialize and type restriction infers type from literal outside def with initialize and type restriction declares instance var of generic type declares instance var of generic type uses virtual types in union uses virtual types in union errors when overriding inherited instance variable with incompatible type errors when overriding inherited instance variable with incompatible type errors if declaring var in Int32 errors if declaring var in Int32 errors when assigning instance variable at top level block errors when assigning instance variable at top level block infers type for non-generic class, with assign infers type for non-generic class, with assign infers type from unless infers type from unless errors if declaring var in Float errors if declaring var in Float can type ivar from class inherited by generic class (#5281) can type ivar from class inherited by generic class (#5281) doesn't check call of non-self instance (#4830) doesn't check call of non-self instance (#4830) infers type from regex literal infers type from regex literal infers type from case infers type from case 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 errors if declaring var in Enum errors if declaring var in Enum errors if declaring var in Proc(*T, R) errors if declaring var in Proc(*T, R) doesn't error when using generic because guessed elsewhere doesn't error when using generic because guessed elsewhere infers from class method that has number literal infers from class method that has number literal infers type from ||= infers type from ||= 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 says can't infer (#2536) says can't infer (#2536) errors if not initialized in all initialize errors if not initialized in all initialize errors if declaring instance variable in module included in Object errors if declaring instance variable in module included in Object infers type from hash literal with literals in generic type infers type from hash literal with literals in generic type infers type from uninitialized infers type from uninitialized infers type for generic class, with begin infers type for generic class, with begin declares instance var with initial value declares instance var with initial value can guess the type from double-splat argument with double-splatted type can guess the type from double-splat argument with double-splatted type errors if declaring var in Pointer(T) errors if declaring var in Pointer(T) transfers initializer from module to generic class transfers initializer from module to generic class infers from Pointer.malloc with two arguments infers from Pointer.malloc with two arguments 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 can guess the type from splat argument with splatted type can guess the type from splat argument with splatted type errors if declaring instance var and turns out to be nilable, in generic module type in generic type errors if declaring instance var and turns out to be nilable, in generic module type in generic type infers type from new expression infers type from new expression declares instance var of generic module declares instance var of generic module infers type for generic class, with && infers type for generic class, with && infers type to be nilable if self is used in same assign infers type to be nilable if self is used in same assign 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) errors if not initializing super variable in generic errors if not initializing super variable in generic doesn't crash when inferring from new without matches (#2538) doesn't crash when inferring from new without matches (#2538) infers type from block argument infers type from block argument doesn't solve instance var initializer in instance context (3) (#5876) doesn't solve instance var initializer in instance context (3) (#5876) is more permissive with macro def initialize, multiple is more permissive with macro def initialize, multiple is more permissive with macro def initialize, bug with named args is more permissive with macro def initialize, bug with named args says undefined instance variable on assign says undefined instance variable on assign declares instance var in module, inherits to type declares instance var in module, inherits to type infers type from hash literal in generic type infers type from hash literal in generic type infers from Pointer.malloc infers from Pointer.malloc errors with macro def but another def doesn't initialize all errors with macro def but another def doesn't initialize all obeys super module initialize (#456) obeys super module initialize (#456) infers type from included module, outside def infers type from included module, outside def doesn't infer unbound generic type on non-generic call (#6390) doesn't infer unbound generic type on non-generic call (#6390) infers type from string interpolation infers type from string interpolation doesn't if declaring nilable instance var and turns out to be nilable doesn't if declaring nilable instance var and turns out to be nilable infers type from argument with restriction, in generic infers type from argument with restriction, in generic inferrs Proc(Void) to Proc(Nil) inferrs Proc(Void) to Proc(Nil) 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 accepts overriding inherited instance variable with compatible type accepts overriding inherited instance variable with compatible type 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 redefined method if calls previous_def infers type from redefined method if calls previous_def infers type from block argument without restriction infers type from block argument without restriction allow usage of instance variable initializer from instance variable initializer allow usage of instance variable initializer from instance variable initializer errors if finally not initialized in macro def errors if finally not initialized in macro def doesn't error when using Class but specifying type doesn't error when using Class but specifying type errors if unknown ivar through macro (#4050) errors if unknown ivar through macro (#4050) errors if declaring var in Reference errors if declaring var in Reference can guess the type from splat argument with splatted type variable can guess the type from splat argument with splatted type variable 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 guesses inside macro for guesses inside macro for doesn't error if calling initialize from another initialize (1) doesn't error if calling initialize from another initialize (1) infers type by removing nil from || left side infers type by removing nil from || left side infers type from instance_sizeof infers type from instance_sizeof guesses virtual array type (3) (#5342) guesses virtual array type (3) (#5342) infers type for generic class, with assign (2) infers type for generic class, with assign (2) errors if not initializing super variables (3) errors if not initializing super variables (3) infers type from literal outside def infers type from literal outside def guesses from hash literal with of, with subclass guesses from hash literal with of, with subclass errors on undefined constant errors on undefined constant doesn't error if inheriting generic instance (#3635) doesn't error if inheriting generic instance (#3635) infers from class method that invokes new infers from class method that invokes new infers type from bool literal infers type from bool literal infers type in multi assign infers type in multi assign infers type from tuple literal infers type from tuple literal declares instance var of generic class after reopen declares instance var of generic class after reopen errors if declaring instance var and turns out to be nilable, in generic module type errors if declaring instance var and turns out to be nilable, in generic module type infers type for generic class, with assign (1) infers type for generic class, with assign (1) infers from method in generic type, with type annotation infers from method in generic type, with type annotation doesn't error if not initializing variables but calling super doesn't error if not initializing variables but calling super declares instance var of generic type subclass declares instance var of generic type subclass infers type from custom generic array literal infers type from custom generic array literal infers type from if infers type from if infers type from lib variable infers type from lib variable infers from Pointer.null in generic type infers from Pointer.null in generic type declares instance var of generic type, with union declares instance var of generic type, with union infers from assign to local var (#2467) infers from assign to local var (#2467) declares instance var which appears in initialize declares instance var which appears in initialize errors on undefined instance var and subclass calling super errors on undefined instance var and subclass calling super infers type from array literal with of metaclass infers type from array literal with of metaclass considers var as assigned in multi-assign considers var as assigned in multi-assign infers type from hash literal from elements infers type from hash literal from elements infers type from && infers type from && infers type from is_a? infers type from is_a? infers from new with return type in generic type infers from new with return type in generic type uses virtual types in self uses virtual types in self doesn't crash on #3580 doesn't crash on #3580 errors if declaring var in Value errors if declaring var in Value doesn't consider self.initialize as initializer (#3239) doesn't consider self.initialize as initializer (#3239) 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 static array declares instance var of generic type, with static array infers type from lib out (3) infers type from lib out (3) declares instance var of generic type through module declares instance var of generic type through module errors if declaring var in StaticArray(T, N) errors if declaring var in StaticArray(T, N) doesn't error if not initializing nilable var in subclass doesn't error if not initializing nilable var in subclass infers type from string literal infers type from string literal guesses from array literal with of, with subclass guesses from array literal with of, with subclass infers from class method that has type annotation infers from class method that has type annotation doesn't error when redeclaring subclass variable with the same type doesn't error when redeclaring subclass variable with the same type looks up self restriction in instantiated type, not defined type looks up self restriction in instantiated type, not defined type is more permissive with macro def initialize is more permissive with macro def initialize errors if declaring generic type without type vars errors if declaring generic type without type vars guesses virtual array type (2) (#5342) guesses virtual array type (2) (#5342) infers from assign to local var in generic type (#2467) infers from assign to local var in generic type (#2467) guesses virtual hash type (2) (#5342) guesses virtual hash type (2) (#5342) infers from class method that refers to constant infers from class method that refers to constant doesn't error if not initializing variables but calling super and previous_def doesn't error if not initializing variables but calling super and previous_def doesn't error when using generic in generic type because guessed elsewhere doesn't error when using generic in generic type because guessed elsewhere infers from new with return type infers from new with return type errors when using Class (#2605) errors when using Class (#2605) ignores redefined initialize (#456) ignores redefined initialize (#456) infers type from assign (1) infers type from assign (1) doesn't error if calling initialize from another initialize (2) doesn't error if calling initialize from another initialize (2) errors when assigning instance variable inside nested expression errors when assigning instance variable inside nested expression infers type from array literal with of infers type from array literal with of errors when assigning instance variable at top level control block errors when assigning instance variable at top level control block doesn't duplicate instance var in subclass doesn't duplicate instance var in subclass instance variable inherited from multiple parents with incompatible type module and class, with definitions module and class, with definitions module and class, with declarations module and class, with declarations errors module and module, with definitions errors module and module, with definitions errors module and module, with declarations errors module and module, with declarations with compatible type module and class, with declarations (2) module and class, with declarations (2) module and class, with definitions module and class, with definitions module and class, with declarations (3) module and class, with declarations (3) accepts module and module, with declarations accepts module and module, with declarations module and class, with declarations module and class, with declarations accepts module and module, with definitions accepts module and module, with definitions errors if not initializing super variables errors if not initializing super variables allows nil instance var because it's a generic type allows nil instance var because it's a generic type ignores super module initialize (#456) ignores super module initialize (#456) infers type from lib out (1) infers type from lib out (1) infers type from begin infers type from begin infers type for generic class, with case infers type for generic class, with case infer from class method where new is redefined infer from class method where new is redefined Codegen: thread local 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 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 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 codegen: previous_def codegens previous def when inside fun with self codegens previous def when inside fun with self correctly passes named arguments correctly passes named arguments codegens previous def when inside fun and forwards args codegens previous def when inside fun and forwards args codegens previous def codegens previous def Lexer lexes ":*" lexes ":*" lexes "-9223372036854775809_i128" lexes "-9223372036854775809_i128" says syntax error on "-9999999999999999999" says syntax error on "-9999999999999999999" lexes "=~" lexes "=~" says syntax error on "\"\\x1z\"" says syntax error on "\"\\x1z\"" says syntax error on "0o1000000000000000000000i64" says syntax error on "0o1000000000000000000000i64" lexes "-0x80000000000000000000000000000000_i128" lexes "-0x80000000000000000000000000000000_i128" lexes "+1_i64" lexes "+1_i64" lexes "^=" lexes "^=" lexes "break" lexes "break" lexes "0x10000_0000_0000_0000_i128" lexes "0x10000_0000_0000_0000_i128" lexes "0b1111111111111111111111111111111_i32" lexes "0b1111111111111111111111111111111_i32" says syntax error on "32768_i16" says syntax error on "32768_i16" lexes "begin" lexes "begin" lexes "1.2e+23_f64" lexes "1.2e+23_f64" lexes "<<" lexes "<<" lexes "0b1_i64" lexes "0b1_i64" lexes "false?" lexes "false?" lexes "<=" lexes "<=" lexes '\v' lexes '\v' lexes "0o777777777777777777777" lexes "0o777777777777777777777" lexes "1i16" lexes "1i16" lexes "**" lexes "**" says syntax error on "-99999999999999999999" says syntax error on "-99999999999999999999" lexes "0" lexes "0" says syntax error on "0b_10" says syntax error on "0b_10" lexes "1i128hello" lexes "1i128hello" lexes "&*" lexes "&*" lexes ":**" lexes ":**" lexes ":foo!" lexes ":foo!" lexes "end?" lexes "end?" lexes "<=>" lexes "<=>" says syntax error on "0x1afafafafafafafafafafafu64" says syntax error on "0x1afafafafafafafafafafafu64" says syntax error on "0x1afafafafafafafafafafafi32" says syntax error on "0x1afafafafafafafafafafafi32" lexes ">>=" lexes ">>=" says syntax error on "4F32" says syntax error on "4F32" lexes "{{" lexes "{{" lexes "*=" lexes "*=" lexes ":=~" lexes ":=~" lexes "true" lexes "true" says syntax error on "2e8i8" says syntax error on "2e8i8" lexes "=" lexes "=" says syntax error on "0b1000000000000000000000000000000000000000000000000000000000000000i64" says syntax error on "0b1000000000000000000000000000000000000000000000000000000000000000i64" lexes "fooBar" lexes "fooBar" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" lexes "do!" lexes "do!" says syntax error on "4i12" says syntax error on "4i12" lexes "0x7fffffff_i32" lexes "0x7fffffff_i32" lexes "0i32" lexes "0i32" lexes "\t" lexes "\t" lexes "://" lexes "://" lexes "elsif" lexes "elsif" lexes "1e23f64" lexes "1e23f64" says syntax error on "-170141183460469231731687303715884105729" says syntax error on "-170141183460469231731687303715884105729" says syntax error on ".42" says syntax error on ".42" lexes "1.2e+23_f32" lexes "1.2e+23_f32" says syntax error on "0o40000000000i32" says syntax error on "0o40000000000i32" lexes "[]" lexes "[]" lexes "+@foo" lexes "+@foo" lexes "1.foo" lexes "1.foo" says syntax error on "4f22" says syntax error on "4f22" lexes "with_1" lexes "with_1" says syntax error on "0x100000000i32" says syntax error on "0x100000000i32" lexes "1_i128" lexes "1_i128" lexes "+1.0f32" lexes "+1.0f32" lexes utf-8 char lexes utf-8 char lexes "|=" lexes "|=" lexes "^" lexes "^" lexes ":<" lexes ":<" lexes ":^" lexes ":^" lexes "+1_i128" lexes "+1_i128" lexes "//" lexes "//" says syntax error on "118446744073709551616_u64" says syntax error on "118446744073709551616_u64" lexes "&*=" lexes "&*=" lexes "when" lexes "when" lexes "extend" lexes "extend" lexes "1f64" lexes "1f64" lexes "&+@foo" lexes "&+@foo" lexes "while?" lexes "while?" lexes "case" lexes "case" lexes symbol followed by != lexes symbol followed by != lexes "1e+23_f32" lexes "1e+23_f32" lexes "-2147483649" lexes "-2147483649" lexes "," lexes "," lexes "||" lexes "||" lexes "do" lexes "do" lexes "12341234🔮" lexes "12341234🔮" lexes "0o17777777777_i32" lexes "0o17777777777_i32" doesn't raise if slash r with slash n doesn't raise if slash r with slash n lexes "0🔮" lexes "0🔮" lexes "-0" lexes "-0" lexes "1e-23" lexes "1e-23" lexes "2_e2" lexes "2_e2" says syntax error on "4i3" says syntax error on "4i3" says syntax error on "00" says syntax error on "00" lexes "rescue" lexes "rescue" says syntax error on "'\\u{D800}'" says syntax error on "'\\u{D800}'" lexes "1" lexes "1" lexes "2e01" lexes "2e01" says syntax error on ":\"foo" says syntax error on ":\"foo" lexes "/" lexes "/" lexes "2147483648" lexes "2147483648" lexes "until" lexes "until" lexes "1.0" lexes "1.0" says syntax error on "-0e_12" says syntax error on "-0e_12" lexes "[]=" lexes "[]=" lexes "0b1111111111111111111111111111111" lexes "0b1111111111111111111111111111111" lexes "}" lexes "}" lexes "type" lexes "type" lexes "!@foo" lexes "!@foo" lexes "1e23" lexes "1e23" lexes "end" lexes "end" lexes "nil!" lexes "nil!" lexes "-0b1010" lexes "-0b1010" lexes "1_u128" lexes "1_u128" lexes ":\"foo\"" lexes ":\"foo\"" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000u64" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000u64" lexes "1f32" lexes "1f32" lexes ":&**" lexes ":&**" lexes "100_000" lexes "100_000" lexes ":&-" lexes ":&-" lexes "asm" lexes "asm" lexes "(" lexes "(" lexes "===" lexes "===" says syntax error on "2e+-2" says syntax error on "2e+-2" lexes comment and token lexes comment and token lexes "1_234.567_890_f32" lexes "1_234.567_890_f32" lexes "1_i32" lexes "1_i32" says syntax error on "'\\u{DFFF}'" says syntax error on "'\\u{DFFF}'" says syntax error on "-0_u64" says syntax error on "-0_u64" lexes ":==" lexes ":==" lexes ":[]" lexes ":[]" lexes "return!" lexes "return!" lexes "0b1000000000000000000000000000000000000000000000000000000000000000" lexes "0b1000000000000000000000000000000000000000000000000000000000000000" lexes ":~" lexes ":~" lexes "-0xFFFFFFFF" lexes "-0xFFFFFFFF" lexes "1i32" lexes "1i32" says syntax error on "-1_u64" says syntax error on "-1_u64" lexes "0x7fffffffffffffff" lexes "0x7fffffffffffffff" lexes "->" lexes "->" lexes "-1.0f32" lexes "-1.0f32" lexes ":foo?" lexes ":foo?" lexes "1e+23" lexes "1e+23" says syntax error on "-0o7777777777777777777777777777777777777777777777777" says syntax error on "-0o7777777777777777777777777777777777777777777777777" lexes "foo?" lexes "foo?" says syntax error on "4.0_u32" says syntax error on "4.0_u32" lexes " " lexes " " lexes "-1" lexes "-1" lexes "&&" lexes "&&" lexes "-0x8000000000000000_i64" lexes "-0x8000000000000000_i64" says syntax error on "18446744073709551616_i32" says syntax error on "18446744073709551616_i32" lexes "0x1_i64" lexes "0x1_i64" lexes "$23?" lexes "$23?" lexes "def?" lexes "def?" lexes "-1234" lexes "-1234" says syntax error on "0o200_i8" says syntax error on "0o200_i8" lexes "+0" lexes "+0" lexes "0x8000000000000000" lexes "0x8000000000000000" says syntax error on "0x1afafafafafafafafafafaf" says syntax error on "0x1afafafafafafafafafafaf" lexes ":&+" lexes ":&+" lexes "+0b1010" lexes "+0b1010" lexes "0b001111111111111111111111111111111111111111111111111111111111111111" lexes "0b001111111111111111111111111111111111111111111111111111111111111111" lexes "1_u8" lexes "1_u8" lexes "&=" lexes "&=" lexes '\\' lexes '\\' lexes "$foo" lexes "$foo" lexes "fun" lexes "fun" lexes "1E40" lexes "1E40" says syntax error on "-3_" says syntax error on "-3_" lexes "\n" lexes "\n" lexes "170141183460469231731687303715884105728_u128" lexes "170141183460469231731687303715884105728_u128" lexes "//=" lexes "//=" lexes ":&*" lexes ":&*" lexes "/=" lexes "/=" says syntax error on "-1_u32" says syntax error on "-1_u32" lexes "1u128" lexes "1u128" lexes ":[]?" lexes ":[]?" says syntax error on "\"hi\\" says syntax error on "\"hi\\" lexes ":-" lexes ":-" lexes "170141183460469231731687303715884105727_i128" lexes "170141183460469231731687303715884105727_i128" lexes utf-8 multibyte char lexes utf-8 multibyte char lexes "for" lexes "for" lexes '\a' lexes '\a' lexes "pointerof" lexes "pointerof" lexes "0o1000000000000000000000" lexes "0o1000000000000000000000" lexes "%" lexes "%" lexes "false!" lexes "false!" lexes ":>" lexes ":>" lexes '\0' lexes '\0' lexes "*" lexes "*" lexes char with unicode codepoint and curly with zeros lexes char with unicode codepoint and curly with zeros lexes "0x3fffffffffffffff" lexes "0x3fffffffffffffff" lexes "||=" lexes "||=" lexes "while!" lexes "while!" lexes '\f' lexes '\f' lexes ":|" lexes ":|" says syntax error on "-999999999999999999999999999999999999999" says syntax error on "-999999999999999999999999999999999999999" lexes regex after \r\n lexes regex after \r\n lexes "return?" lexes "return?" lexes "with" lexes "with" lexes "end!" lexes "end!" lexes "begin!" lexes "begin!" lexes "18446744073709551615" lexes "18446744073709551615" lexes "unless" lexes "unless" lexes space after char lexes space after char lexes ")" lexes ")" lexes "do?" lexes "do?" lexes "1hello" lexes "1hello" lexes "private" lexes "private" says syntax error on "-9223372036854775809_i64" says syntax error on "-9223372036854775809_i64" lexes "::" lexes "::" lexes "out" lexes "out" lexes ":foo" lexes ":foo" lexes "offsetof" lexes "offsetof" lexes "0xffff_ffff_ffff_ffff" lexes "0xffff_ffff_ffff_ffff" says syntax error on "2ef32" says syntax error on "2ef32" lexes float then zero (bug) lexes float then zero (bug) lexes "==" lexes "==" says syntax error on "-1_u8" says syntax error on "-1_u8" lexes ":%" lexes ":%" says syntax error on "/foo" says syntax error on "/foo" says syntax error on "$01" says syntax error on "$01" lexes "-0.0f32" lexes "-0.0f32" lexes "-" lexes "-" says syntax error on "0o7777777777777777777777777777777777777777777777777" says syntax error on "0o7777777777777777777777777777777777777777777777777" lexes ":foo=" lexes ":foo=" says syntax error on "65536_u16" says syntax error on "65536_u16" lexes "$?" lexes "$?" lexes ":[]=" lexes ":[]=" lexes "if!" lexes "if!" lexes "if?" lexes "if?" lexes "\1" lexes "\1" lexes "union" lexes "union" lexes "unless!" lexes "unless!" lexes "&" lexes "&" lexes "as" lexes "as" says syntax error on "4u22" says syntax error on "4u22" says syntax error on "118446744073709551616" says syntax error on "118446744073709551616" lexes "elsif?" lexes "elsif?" lexes "-0x80000001" lexes "-0x80000001" lexes "next?" lexes "next?" lexes ":" lexes ":" lexes "0o177777_77777777_77777777" lexes "0o177777_77777777_77777777" lexes symbol followed by == lexes symbol followed by == lexes regex after \n lexes regex after \n lexes "_" lexes "_" lexes "1u64" lexes "1u64" says syntax error on "0o200000_00000000_00000000" says syntax error on "0o200000_00000000_00000000" lexes "@foo" lexes "@foo" lexes "break?" lexes "break?" lexes "$1" lexes "$1" lexes "protected" lexes "protected" lexes "0b1010" lexes "0b1010" says syntax error on "2e" says syntax error on "2e" lexes "0e40" lexes "0e40" lexes "0o123_i64" lexes "0o123_i64" says syntax error on "-11111111111111111111" says syntax error on "-11111111111111111111" lexes "-0o123" lexes "-0o123" lexes "nil?" lexes "nil?" lexes "begin?" lexes "begin?" lexes "self" lexes "self" lexes "1_u32" lexes "1_u32" lexes "if" lexes "if" lexes "..." lexes "..." lexes "+0xFFFF" lexes "+0xFFFF" lexes "0x7fffffff" lexes "0x7fffffff" lexes "1u32" lexes "1u32" lexes "def" lexes "def" lexes "struct" lexes "struct" lexes "[" lexes "[" lexes "-1.0" lexes "-1.0" lexes "$foo123" lexes "$foo123" lexes "1i128" lexes "1i128" says syntax error on "4f65" says syntax error on "4f65" lexes "|" lexes "|" says syntax error on "256_u8" says syntax error on "256_u8" lexes "yield" lexes "yield" lexes "+1.0" lexes "+1.0" lexes "+0o123" lexes "+0o123" lexes "else?" lexes "else?" says syntax error on "340282366920938463463374607431768211456" says syntax error on "340282366920938463463374607431768211456" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" says syntax error on "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" doesn't raise if many slash r with slash n doesn't raise if many slash r with slash n says syntax error on "-0x80000000000000000000000000000000" says syntax error on "-0x80000000000000000000000000000000" lexes "macro" lexes "macro" says syntax error on "18446744073709551616_u64" says syntax error on "18446744073709551616_u64" lexes "1i64" lexes "1i64" lexes "class?" lexes "class?" lexes "=>" lexes "=>" lexes "1.2e+23" lexes "1.2e+23" lexes ":/" lexes ":/" lexes "%=" lexes "%=" lexes "1u8" lexes "1u8" lexes "1_i64" lexes "1_i64" lexes comment at the end lexes comment at the end lexes "-0.5" lexes "-0.5" says syntax error on "0x8000000000000000i64" says syntax error on "0x8000000000000000i64" lexes "|" lexes "|" says syntax error on "'\\" says syntax error on "'\\" lexes '\b' lexes '\b' lexes "❨╯°□°❩╯︵┻━┻" lexes "❨╯°□°❩╯︵┻━┻" lexes "yield!" lexes "yield!" lexes "1_u16" lexes "1_u16" lexes "alias" lexes "alias" says syntax error on "$0?" says syntax error on "$0?" says syntax error on "2e+" says syntax error on "2e+" says syntax error on "0o73_f64" says syntax error on "0o73_f64" lexes "as?" lexes "as?" says syntax error on "-.42" says syntax error on "-.42" says syntax error on "128_i8" says syntax error on "128_i8" lexes "-@foo" lexes "-@foo" says syntax error on "4i33" says syntax error on "4i33" lexes '\n' lexes '\n' lexes "9223372036854775808" lexes "9223372036854775808" lexes "10000000000000000000_u64" lexes "10000000000000000000_u64" lexes "return" lexes "return" lexes symbol with backslash (#2187) lexes symbol with backslash (#2187) says syntax error on "\"\\xz\"" says syntax error on "\"\\xz\"" lexes symbol followed by === lexes symbol followed by === lexes "responds_to?" lexes "responds_to?" lexes ":<=>" lexes ":<=>" says syntax error on "-0x80000000000000000000000000000001" says syntax error on "-0x80000000000000000000000000000001" lexes "1_234.567_890" lexes "1_234.567_890" lexes ":+" lexes ":+" lexes "1i64hello" lexes "1i64hello" says syntax error on "-9223372036854775809" says syntax error on "-9223372036854775809" lexes "\x12" lexes "\x12" lexes "class!" lexes "class!" lexes "else" lexes "else" lexes "0o123" lexes "0o123" lexes "ident" lexes "ident" lexes "next!" lexes "next!" lexes "0_f32" lexes "0_f32" lexes "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111" lexes "0b11111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111" lexes "+0.5" lexes "+0.5" says syntax error on "-1_u16" says syntax error on "-1_u16" lexes ":>=" lexes ":>=" says syntax error on "0o200000_00000000_00000000_u64" says syntax error on "0o200000_00000000_00000000_u64" lexes "ensure" lexes "ensure" lexes "&-@foo" lexes "&-@foo" lexes "340282366920938463463374607431768211455_u128" lexes "340282366920938463463374607431768211455_u128" says syntax error on "10e_10" says syntax error on "10e_10" lexes "&+=" lexes "&+=" lexes ":&" lexes ":&" lexes "true?" lexes "true?" lexes "1234" lexes "1234" says syntax error on "0b11_f32" says syntax error on "0b11_f32" lexes "@[" lexes "@[" lexes "unless?" lexes "unless?" lexes "1.0f64" lexes "1.0f64" says syntax error on "0o1234567123456712345671234567u64" says syntax error on "0o1234567123456712345671234567u64" lexes ">" lexes ">" lexes "super" lexes "super" lexes "%}" lexes "%}" lexes char with unicode codepoint and curly lexes char with unicode codepoint and curly lexes ":===" lexes ":===" says syntax error on "0b🔮" says syntax error on "0b🔮" lexes != after identifier (#4815) lexes != after identifier (#4815) lexes "\xFF" lexes "\xFF" lexes "" lexes "" says syntax error on "0b10000000_i8" says syntax error on "0b10000000_i8" lexes '\0' lexes '\0' 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 "-=" lexes "-=" lexes "Foo" lexes "Foo" lexes "0o1000000000000000000000" lexes "0o1000000000000000000000" says syntax error on "4u33" says syntax error on "4u33" lexes "false" lexes "false" lexes "$10" lexes "$10" lexes "elsif!" lexes "elsif!" lexes "0b100000000000000000000000000000000" lexes "0b100000000000000000000000000000000" lexes "<" lexes "<" lexes "1_i64" lexes "1_i64" 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 "0123" says syntax error on "0123" lexes not instance var lexes not instance var lexes "\110" lexes "\110" lexes "1i64" lexes "1i64" lexes "0o37777777777" lexes "0o37777777777" lexes "sizeof" lexes "sizeof" lexes "0xFFFF" lexes "0xFFFF" lexes "$_foo" lexes "$_foo" lexes "9223372036854775807" lexes "9223372036854775807" lexes "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128" lexes "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF_u128" lexes "118446744073709551616_u128" lexes "118446744073709551616_u128" lexes "$FOO" lexes "$FOO" lexes "\8" lexes "\8" lexes ".." lexes ".." lexes ":<<" lexes ":<<" lexes "~" lexes "~" lexes "14146167139683460000" lexes "14146167139683460000" lexes "nil" lexes "nil" says syntax error on "4i65" says syntax error on "4i65" lexes "yield?" lexes "yield?" says syntax error on "4i22" says syntax error on "4i22" lexes '\r' lexes '\r' lexes ">>" lexes ">>" says syntax error on "4294967296_u32" says syntax error on "4294967296_u32" says syntax error on "'\\uDFFF'" says syntax error on "'\\uDFFF'" lexes "0o40000000000" lexes "0o40000000000" lexes "1_u64" lexes "1_u64" says syntax error on "-129_i8" says syntax error on "-129_i8" lexes char with unicode codepoint lexes char with unicode codepoint lexes "0_i32" lexes "0_i32" lexes "\n\n\n" lexes "\n\n\n" says syntax error on "9999999999999999999_i32" says syntax error on "9999999999999999999_i32" lexes ";" lexes ";" lexes __FILE__ lexes __FILE__ lexes "0xffffffffffffffff" lexes "0xffffffffffffffff" lexes "typeof" lexes "typeof" lexes "\10" lexes "\10" says syntax error on "-2147483649_i32" says syntax error on "-2147483649_i32" lexes "lib" lexes "lib" lexes '\'' lexes '\'' says syntax error on "2e+_2" says syntax error on "2e+_2" lexes "while" lexes "while" says syntax error on "4f33" says syntax error on "4f33" says syntax error on "4u12" says syntax error on "4u12" says syntax error on "2147483648_i32" says syntax error on "2147483648_i32" lexes __DIR__ lexes __DIR__ lexes "select" lexes "select" lexes "0xffffffff" lexes "0xffffffff" lexes "0o17777777777" lexes "0o17777777777" lexes "instance_sizeof" lexes "instance_sizeof" lexes "verbatim" lexes "verbatim" lexes "&&=" lexes "&&=" lexes "require" lexes "require" says syntax error on "1__1" says syntax error on "1__1" lexes '\t' lexes '\t' lexes "of" lexes "of" lexes "def!" lexes "def!" lexes ":>>" lexes ":>>" lexes "0xFFFF_u64" lexes "0xFFFF_u64" lexes "0x100000000" lexes "0x100000000" lexes "]" lexes "]" lexes "with_underscores" lexes "with_underscores" says syntax error on "-1_u128" says syntax error on "-1_u128" lexes "$10?" lexes "$10?" lexes dot and ident lexes dot and ident lexes "0x80000001" lexes "0x80000001" lexes "\4" lexes "\4" lexes "0xFFFFFFFF" lexes "0xFFFFFFFF" lexes "0.5" lexes "0.5" lexes "+" lexes "+" lexes "&+" lexes "&+" lexes "18446744073709551616_u128" lexes "18446744073709551616_u128" lexes "." lexes "." lexes "bar!" lexes "bar!" lexes "0i8" lexes "0i8" says syntax error on "'" says syntax error on "'" lexes __LINE__ lexes __LINE__ says syntax error on "0o1234567123456712345671234567" says syntax error on "0o1234567123456712345671234567" lexes "<<=" lexes "<<=" lexes 'a' lexes 'a' lexes "1.0hello" lexes "1.0hello" lexes "class" lexes "class" lexes ":!=" lexes ":!=" says syntax error on "1_.1" says syntax error on "1_.1" says syntax error on "01_i64" says syntax error on "01_i64" says syntax error on "18446744073709551616" says syntax error on "18446744073709551616" lexes ":<=" lexes ":<=" lexes "1.0f32" lexes "1.0f32" says syntax error on "4u65" says syntax error on "4u65" lexes "0b0_1" lexes "0b0_1" lexes space after keyword lexes space after keyword lexes "$1?" lexes "$1?" lexes "**=" lexes "**=" lexes "&-" lexes "&-" lexes symbol with quote lexes symbol with quote lexes "1.0f32hello" lexes "1.0f32hello" says syntax error on "'\\uD800'" says syntax error on "'\\uD800'" lexes "uninitialized" lexes "uninitialized" lexes "then" lexes "then" lexes char with unicode codepoint and curly with six hex digits lexes char with unicode codepoint and curly with six hex digits says syntax error on "0b100000000000000000000000000000000i32" says syntax error on "0b100000000000000000000000000000000i32" lexes "-9223372036854775808" lexes "-9223372036854775808" lexes "include" lexes "include" says syntax error on "0o12345671234567_12345671234567_i8" says syntax error on "0o12345671234567_12345671234567_i8" says syntax error on "\"\\400\"" says syntax error on "\"\\400\"" lexes "something" lexes "something" lexes "abstract" lexes "abstract" says syntax error on "4u3" says syntax error on "4u3" lexes "9223372036854775808_i128" lexes "9223372036854775808_i128" says syntax error on "0x10000_0000_0000_0000_u64" says syntax error on "0x10000_0000_0000_0000_u64" lexes "0x00ffffffffffffffff" lexes "0x00ffffffffffffffff" says syntax error on "4F64" says syntax error on "4F64" says syntax error on "2e+e" says syntax error on "2e+e" lexes "!~" lexes "!~" lexes "&-=" lexes "&-=" lexes "1.0f32" lexes "1.0f32" lexes ":!~" lexes ":!~" lexes "+1" lexes "+1" lexes "[]?" lexes "[]?" lexes "$~" lexes "$~" lexes "-0xFFFF" lexes "-0xFFFF" lexes ">=" lexes ">=" says syntax error on ":+1" says syntax error on ":+1" lexes "1_i16" lexes "1_i16" lexes "next" lexes "next" lexes "is_a?" lexes "is_a?" says syntax error on "0xfffffffffffffffff_u64" says syntax error on "0xfffffffffffffffff_u64" lexes "@@foo" lexes "@@foo" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000" says syntax error on "0b100000000000000000000000000000000000000000000000000000000000000000" lexes "+=" lexes "+=" lexes "{%" lexes "{%" lexes "module" lexes "module" lexes ":!" lexes ":!" lexes "1i8" lexes "1i8" lexes "?" lexes "?" invalid byte sequence invalid byte sequence lexes "0o001777777777777777777777" lexes "0o001777777777777777777777" says syntax error on "0xFF_i8" says syntax error on "0xFF_i8" lexes "enum" lexes "enum" lexes "1_000" lexes "1_000" lexes "annotation" lexes "annotation" says syntax error on "0F32" says syntax error on "0F32" lexes "0xabcdef" lexes "0xabcdef" lexes "+1234" lexes "+1234" says syntax error on "2e+f32" says syntax error on "2e+f32" says syntax error on "'\\u{}'" says syntax error on "'\\u{}'" says syntax error on "'\\1'" says syntax error on "'\\1'" lexes "0o700000000000000000000" lexes "0o700000000000000000000" says syntax error on "2e+@foo" says syntax error on "2e+@foo" says syntax error on "-32769_i16" says syntax error on "-32769_i16" says syntax error on "-0u64" says syntax error on "-0u64" says syntax error on "9223372036854775808_i64" says syntax error on "9223372036854775808_i64" lexes "1u16" lexes "1u16" says syntax error on "/\\" says syntax error on "/\\" says syntax error on "0x10000_0000_0000_0000" says syntax error on "0x10000_0000_0000_0000" lexes "0b111111111111111111111111111111111111111111111111111111111111111" lexes "0b111111111111111111111111111111111111111111111111111111111111111" says syntax error on "'\\uFEDZ'" says syntax error on "'\\uFEDZ'" lexes ":かたな" lexes ":かたな" lexes "else!" lexes "else!" says syntax error on "'\\u{110000}'" says syntax error on "'\\u{110000}'" lexes "2147483648.foo" lexes "2147483648.foo" lexes heredoc start lexes heredoc start lexes "in" lexes "in" lexes "&**" lexes "&**" lexes "!=" lexes "!=" lexes "1_i8" lexes "1_i8" says syntax error on "\r1" says syntax error on "\r1" lexes "-1_i64" lexes "-1_i64" lexes "!" lexes "!" lexes "0b11111111111111111111111111111111" lexes "0b11111111111111111111111111111111" says syntax error on "0_12" says syntax error on "0_12" lexes "break!" lexes "break!" lexes "-1_i128" lexes "-1_i128" lexes "0x3🔮" lexes "0x3🔮" lexes "0f32" lexes "0f32" lexes "true!" lexes "true!" lexes "{" lexes "{" Normalize: array literal normalizes non-empty without of normalizes non-empty without of normalizes non-empty with of normalizes non-empty with of normalizes non-empty without of, with splat normalizes non-empty without of, with splat normalizes non-empty with of, with splat normalizes non-empty with of, with splat hoists complex element expressions, with splat hoists complex element expressions, with splat hoists complex element expressions, array-like generic hoists complex element expressions, array-like generic hoists complex element expressions hoists complex element expressions normalizes empty with of normalizes empty with of hoists complex element expressions, array-like hoists complex element expressions, array-like normalizes non-empty without of, with splat only normalizes non-empty without of, with splat only Crystal::Repl can parse and evaluate snippets can parse and evaluate snippets can return static and runtime type information for Non Union Non Union MixedUnionType MixedUnionType UnionType UnionType VirtualType VirtualType Semantic: lib reports error on typedef type not primitive like reports error on typedef type not primitive like reopens lib and adds same link annotations reopens lib and adds same link annotations errors if redefining fun with different signature (#2468) errors if redefining fun with different signature (#2468) 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 out can only be used with lib funs reports error out can only be used with lib funs errors if missing argument errors if missing argument defines lib funs before funs with body defines lib funs before funs with body error if passing non primitive type as varargs invoking to_unsafe error if passing non primitive type as varargs invoking to_unsafe doesn't try to invoke unsafe for c struct/union (#1362) doesn't try to invoke unsafe for c struct/union (#1362) errors if passing void lib call to call argument (#4414) errors if passing void lib call to call argument (#4414) reports redefinition of fun with different signature reports redefinition of fun with different signature specifies a call convention to a lib specifies a call convention to a lib reports error on struct field type not primitive like reports error on struct field type not primitive like errors if parameter already specified errors if parameter already specified errors if using out with void pointer (#2424) errors if using out with void pointer (#2424) types lib var get with forward declaration types lib var get with forward declaration types fun returning nil as nil types fun returning nil as nil 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 can use named args can use named args errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call specifies a call convention specifies a call convention raises wrong argument type raises wrong argument type types a varargs external types a varargs external can use out with named args can use out with named args 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) errors if lib named arg is not a String errors if lib named arg is not a String supports forward references (#399) supports forward references (#399) reports error on fun argument type not primitive like, Nil (#2994) reports error on fun argument type not primitive like, Nil (#2994) errors if using out with non-pointer errors if using out with non-pointer errors if missing link arguments errors if missing link arguments errors if using named args with variadic function errors if using named args with variadic function errors if unknown named arg errors if unknown named arg reports error when changing instance var type and something breaks reports error when changing instance var type and something breaks passes int as another integer type in variable passes int as another integer type in variable 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) reopens lib and adds more link annotations reopens lib and adds more link annotations errors if CallConvention argument is not a string errors if CallConvention argument is not a string reports error on fun return type not primitive like reports error on fun return type not primitive like allows dll argument allows dll argument errors if using void as parameter (related to #508) errors if using void as parameter (related to #508) raises on undefined fun raises on undefined fun errors if first argument is not a string errors if first argument is not a string errors if missing arguments errors if missing arguments errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type allows passing splat to LibC fun allows passing splat to LibC fun warns if @[Link(static: true)] is specified warns if @[Link(static: true)] is specified disallows passing nil or pointer to arg expecting pointer disallows passing nil or pointer to arg expecting pointer 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 types lib var set types lib var set types lib var get types lib var get 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 can list lib functions at the top level (#12395) can list lib functions at the top level (#12395) types fun returning nothing as nil types fun returning nothing as nil defined fun with aliased type defined fun with aliased type supports forward references with struct inside struct (#399) supports forward references with struct inside struct (#399) errors if lib already specified with positional argument errors if lib already specified with positional argument allows invoking out with underscore allows invoking out with underscore can use tuple as fun return can use tuple as fun return errors if lib fun call is part of dispatch errors if lib fun call is part of dispatch reports error on fun argument type not primitive like reports error on fun argument type not primitive like reports error if using out with an already declared variable reports error if using out with an already declared variable errors if dll argument does not end with '.dll' errors if dll argument does not end with '.dll' warns if Link annotations use positional arguments warns if Link annotations use positional arguments clears annotations after lib clears annotations after lib gathers link annotations from macro expression gathers link annotations from macro expression errors if defines def on lib errors if defines def on lib can use macros inside lib can use macros inside lib errors if using unknown named param errors if using unknown named param allows passing double splat to LibC fun allows passing double splat to LibC fun raises wrong number of arguments raises wrong number of arguments errors if using out with varargs errors if using out with varargs error if passing non primitive type as varargs error if passing non primitive type as varargs errors if CallConvention argument is not a valid string errors if CallConvention argument is not a valid string overrides definition of fun overrides definition of fun can use macros inside struct can use macros inside struct allows invoking lib call without obj inside lib allows invoking lib call without obj inside lib errors if assigning void lib call to var (#4414) errors if assigning void lib call to var (#4414) passes float as another integer type in variable passes float as another integer type in variable errors if using out with void pointer through type errors if using out with void pointer through type types fun returning void as nil types fun returning void as nil errors if fourth argument is not a bool errors if fourth argument is not a bool passes int as another integer type with literal passes int as another integer type with literal errors if using void via typedef as parameter (related to #508) errors if using void via typedef as parameter (related to #508) reports error when changing var type and something breaks reports error when changing var type and something breaks errors if third argument is not a bool errors if third argument is not a bool errors if too many link arguments errors if too many link arguments Crystal::Repl::Interpreter enum does enum value does enum value does enum new does enum new Codegen: extern struct declares extern struct with no constructor, assigns var declares extern struct with no constructor, assigns var codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil declares extern struct with no constructor declares extern struct with no constructor 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 union with no constructor declares extern union 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 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 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 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 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 invokes proc with extern struct invokes proc with extern struct 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 declares extern union, sets and gets instance var declares extern union, sets and gets instance 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 extern proc call twice (#4982) codegens extern proc call twice (#4982) declares extern struct, sets and gets instance var declares extern struct, sets and gets instance var 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) Semantic: virtual metaclass restricts virtual metaclass to Class (#11376) restricts virtual metaclass to Class (#11376) types virtual metaclass types virtual metaclass types virtual metaclass method types virtual metaclass method yields virtual type in block arg if class is abstract yields virtual type in block arg if class is abstract allows passing metaclass to virtual metaclass restriction allows passing metaclass to virtual metaclass restriction merges metaclass types merges metaclass types 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 allows allocating virtual type when base class is abstract allows allocating virtual type when base class is abstract cleanup strip named-tuple elements after unreachable element strip named-tuple elements after unreachable element errors if assigning var to itself errors if assigning var to itself 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: responds_to? restricts in assignment restricts in assignment 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 type inside if scope 1 restricts type inside if scope 1 restricts other types inside if else restricts other types inside if else is bool is bool Code gen: sizeof gets sizeof class gets sizeof class gets sizeof NoReturn gets sizeof NoReturn can use instance_sizeof of virtual type can use instance_sizeof of virtual type gets sizeof struct gets sizeof struct gets sizeof int gets sizeof int doesn't precompute sizeof of module (#7741) doesn't precompute sizeof of module (#7741) can use sizeof in type argument (1) can use sizeof in type argument (1) can use sizeof in type argument (2) can use sizeof in type argument (2) gets sizeof Bool (#8272) gets sizeof Bool (#8272) gets sizeof Nil (#7644) gets sizeof Nil (#7644) gets instance_sizeof class gets instance_sizeof class doesn't precompute sizeof of abstract struct (#7741) doesn't precompute sizeof of abstract struct (#7741) returns correct sizeof for abstract struct (#4319) returns correct sizeof for abstract struct (#4319) can use instance_sizeof in type argument can use instance_sizeof in type argument 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 gets sizeof Void gets sizeof Void gets sizeof union gets sizeof union gets instance_sizeof a generic type with type vars gets instance_sizeof a generic type with type vars can use sizeof of virtual type can use sizeof of virtual type alignof gets alignof union gets alignof union gets alignof primitive types gets alignof primitive types gets alignof class gets alignof class alignof mixed union is not less than alignof its variant types alignof mixed union is not less than alignof its variant types gets alignof struct gets alignof struct Code gen: debug stores and restores debug location after jumping to main (2) stores and restores debug location after jumping to main (2) 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) has debug info in closure inside if (#5593) has debug info in closure inside if (#5593) doesn't emit debug info for unused variable declarations (#9882) doesn't emit debug info for unused variable declarations (#9882) 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 codegens extern union (#7335) codegens extern union (#7335) codegens lib union (#7335) codegens lib union (#7335) codegens correct debug info for untyped expression (#4007 and #4008) codegens correct debug info for untyped expression (#4007 and #4008) stores and restores debug location after jumping to main (#6920) stores and restores debug location after jumping to main (#6920) doesn't fail on constant read calls (#11416) doesn't fail on constant read calls (#11416) doesn't emit incorrect debug info for closured self doesn't emit incorrect debug info for closured self inlines instance var access through getter in debug mode inlines instance var access through getter in debug mode codegens abstract struct (#3578) codegens abstract struct (#3578) codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for new with custom allocate (#3945) stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (3) Normalize: until normalizes until normalizes until Crystal::Formatter formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\nend" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\nend" formats "if 1\n ((1) + 2)\nend" formats "if 1\n ((1) + 2)\nend" formats "{ # foo\n 1,\n}" formats "{ # foo\n 1,\n}" formats "if a\n2\nend" formats "if a\n2\nend" formats "foo(&.@bar)" formats "foo(&.@bar)" formats "def %(x)\n 1\nend" formats "def %(x)\n 1\nend" formats "def foo(x : (A | B)) \n end" formats "def foo(x : (A | B)) \n end" formats "select \n when foo \n 2 \n else \n 3 \n end" formats "select \n when foo \n 2 \n else \n 3 \n end" formats "->do\nend" formats "->do\nend" formats "1 # foo\n1234 # bar" formats "1 # foo\n1234 # bar" formats "foo(\n 1, 2)" formats "foo(\n 1, 2)" formats "-> : Int32 {}" formats "-> : Int32 {}" formats "foo" formats "foo" formats "x : A | B" formats "x : A | B" formats "<<-HEREDOC\n \#{foo}\n H\#{bar}\n HEREDOC" formats "<<-HEREDOC\n \#{foo}\n H\#{bar}\n HEREDOC" formats "alias Foo::Bar = Baz" formats "alias Foo::Bar = Baz" formats "break {1, 2}, 3" formats "break {1, 2}, 3" formats "-> :: foo?" formats "-> :: foo?" formats "`foo \#{ bar }`" formats "`foo \#{ bar }`" formats "foo . responds_to?( :bar )" formats "foo . responds_to?( :bar )" formats "lib Foo\nfun foo() : Int32\nend" formats "lib Foo\nfun foo() : Int32\nend" formats "module Ton\n macro foo\n class {{name.id}}\n end\n end\nend" formats "module Ton\n macro foo\n class {{name.id}}\n end\n end\nend" formats "unless a\nunless b\nelse\n4\nend\nend" formats "unless a\nunless b\nelse\n4\nend\nend" formats "def foo\n # Comment\n\n\nend" formats "def foo\n # Comment\n\n\nend" formats "\"\#{\n foo = 1\n}\"" formats "\"\#{\n foo = 1\n}\"" formats "foo do # hello\nend" formats "foo do # hello\nend" formats "p = Foo[\n 1, 2, 3,\n 4, 5, 6\n]\n" formats "p = Foo[\n 1, 2, 3,\n 4, 5, 6\n]\n" formats "[\n 1, # foo\n 3,\n]" formats "[\n 1, # foo\n 3,\n]" formats ":<<" formats ":<<" formats "a = foo(baz1 do\nend)" formats "a = foo(baz1 do\nend)" formats "yield *1 ,2" formats "yield *1 ,2" formats "next *1" formats "next *1" formats "foo { | a, ( b , c ) | a + b + c }" formats "foo { | a, ( b , c ) | a + b + c }" formats "1234 # foo\n1 # bar" formats "1234 # foo\n1 # bar" formats "enum Foo : Int32\nA = 1\ndef foo\n1\nend\nend" formats "enum Foo : Int32\nA = 1\ndef foo\n1\nend\nend" formats "def `(x)\n 1\nend" formats "def `(x)\n 1\nend" formats "foo &.as?(T)" formats "foo &.as?(T)" formats "foo(\"bar\" \\\n\"baz\")" formats "foo(\"bar\" \\\n\"baz\")" formats "foo 1, # comment\n # bar\n do\n end" formats "foo 1, # comment\n # bar\n do\n end" formats "yield 1" formats "yield 1" formats "foo 1 , 2" formats "foo 1 , 2" formats "x = 1\nx += 1" formats "x = 1\nx += 1" formats "$0" formats "$0" formats "macro foo(\n a,\n *b,\n)\nend" formats "macro foo(\n a,\n *b,\n)\nend" formats "Foo::Bar?" formats "Foo::Bar?" formats "[foo <<-X\nbar\nX\n]" formats "[foo <<-X\nbar\nX\n]" formats "private def foo\nend\nprivate def bar\nend" formats "private def foo\nend\nprivate def bar\nend" formats "begin\n 1 + \\\n 2\n 3\nend" formats "begin\n 1 + \\\n 2\n 3\nend" formats " {% for x in y %} 2 {% end %}" formats " {% for x in y %} 2 {% end %}" formats "1 ;\n 2" formats "1 ;\n 2" formats "if 1\n2 && 3\nend" formats "if 1\n2 && 3\nend" formats "1 if 2\n# foo\n3" formats "1 if 2\n# foo\n3" formats "foo(\n <<-HERE,\n hello\n HERE\n 1,\n)" formats "foo(\n <<-HERE,\n hello\n HERE\n 1,\n)" formats "def foo ( ) \n1\nend" formats "def foo ( ) \n1\nend" formats "foo \\\n 1,\n 2" formats "foo \\\n 1,\n 2" formats "1\n\n\n2" formats "1\n\n\n2" formats "def foo : A(B)\n nil\nend" formats "def foo : A(B)\n nil\nend" formats "1.<=(2) { 3 }" formats "1.<=(2) { 3 }" formats "macro foo\n {% if 1 %}\\ 2 {% else %}\\ 3 {% end %}\\\nend" formats "macro foo\n {% if 1 %}\\ 2 {% else %}\\ 3 {% end %}\\\nend" formats "lib Foo\nstruct Foo\nx : Int32\ny : Float64\nend\nend" formats "lib Foo\nstruct Foo\nx : Int32\ny : Float64\nend\nend" formats "def foo(**z, &block)\nend" formats "def foo(**z, &block)\nend" formats "def foo\n\n1\n\nend" formats "def foo\n\n1\n\nend" formats "foo(1,\n2,\n)" formats "foo(1,\n2,\n)" formats "x : { {A, B}, {C, D} }" formats "x : { {A, B}, {C, D} }" formats "def foo(\n foo,\n @[MyAnn]\n &block\n); end" formats "def foo(\n foo,\n @[MyAnn]\n &block\n); end" formats "foo( )" formats "foo( )" formats "lib Foo\nfun foo(x : Int32,\ny : Float64) : Int32\nend" formats "lib Foo\nfun foo(x : Int32,\ny : Float64) : Int32\nend" formats "macro foo\n 1 + 2 \n end" formats "macro foo\n 1 + 2 \n end" formats "begin\n1\nrescue\n3\nensure\n2\nend" formats "begin\n1\nrescue\n3\nensure\n2\nend" formats "def foo()\n1\nend" formats "def foo()\n1\nend" formats "foo (1).bar" formats "foo (1).bar" formats "case 1\nwhen 8 then 1\nwhen 16 then 2\nwhen 256 then 3\nwhen 'a' then 5\nwhen \"foo\" then 6\nelse 4\nend" formats "case 1\nwhen 8 then 1\nwhen 16 then 2\nwhen 256 then 3\nwhen 'a' then 5\nwhen \"foo\" then 6\nelse 4\nend" formats "class Actor\n macro inherited\nend\nend\n" formats "class Actor\n macro inherited\nend\nend\n" formats "%r(foo \#{ bar })" formats "%r(foo \#{ bar })" formats "a=1" formats "a=1" formats "\n# hello\n\n1" formats "\n# hello\n\n1" formats "foo.bar. as Int32" formats "foo.bar. as Int32" formats "asm(\"a\" ::: \"a\"\n : \"volatile\",\n \"intel\")" formats "asm(\"a\" ::: \"a\"\n : \"volatile\",\n \"intel\")" formats "1 && # foo\n 2 &&\n 3" formats "1 && # foo\n 2 &&\n 3" formats "alias A = (B(C, (C | D)) | E)" formats "alias A = (B(C, (C | D)) | E)" formats "lib LibFoo\n {% begin %}\n fun foo : Int32\n {% end %}\nend" formats "lib LibFoo\n {% begin %}\n fun foo : Int32\n {% end %}\nend" formats "macro foo\n macro bar\n \\{% begin %}\n \\\\{% puts %}\n \\{% end %}\n end\nend" formats "macro foo\n macro bar\n \\{% begin %}\n \\\\{% puts %}\n \\{% end %}\n end\nend" formats "1\n\n2" formats "1\n\n2" formats "-> : {Int32, String} {}" formats "-> : {Int32, String} {}" formats "1/2" formats "1/2" formats "def foo( x , * y )\nend" formats "def foo( x , * y )\nend" formats "[\n a(), # b\n]" formats "[\n a(), # b\n]" formats "::Foo:: Bar" formats "::Foo:: Bar" formats "case 1 \n when 2 ; 3 \n end" formats "case 1 \n when 2 ; 3 \n end" formats "if 1\nif 2\n3 # foo\nend\nend" formats "if 1\nif 2\n3 # foo\nend\nend" formats "def foo\nselect \n when foo \n 2 \n else \n 3 \nend\nend" formats "def foo\nselect \n when foo \n 2 \n else \n 3 \nend\nend" formats "x : Int32[ 8 ]" formats "x : Int32[ 8 ]" formats "a = [\n1,\n2]" formats "a = [\n1,\n2]" formats "foo &.bar do\n 1 + 2\nend" formats "foo &.bar do\n 1 + 2\nend" formats "foo(//, //)" formats "foo(//, //)" formats "# ```text\n# 1 + 2\n# ```" formats "# ```text\n# 1 + 2\n# ```" formats "macro foo( x = 1, y = 2, &block)\nend" formats "macro foo( x = 1, y = 2, &block)\nend" formats "a = 1;;; b = 2" formats "a = 1;;; b = 2" formats "def foo\n# hello\n1\nend" formats "def foo\n# hello\n1\nend" formats "a.b &.[c]\n1" formats "a.b &.[c]\n1" formats "def foo(x) forall T # bar\n # baz\nend" formats "def foo(x) forall T # bar\n # baz\nend" formats "a &.b[c]?" formats "a &.b[c]?" formats "alias Foo =Bar" formats "alias Foo =Bar" formats "foo \\\n foo: 1,\n bar: 2" formats "foo \\\n foo: 1,\n bar: 2" formats "$~.bar" formats "$~.bar" formats "macro foo()\n {% if 1 %} 2 {% end %}\nend" formats "macro foo()\n {% if 1 %} 2 {% end %}\nend" formats "%w(\n one two\n three four\n)" formats "%w(\n one two\n three four\n)" formats "-> do\nend" formats "-> do\nend" formats "case 1\nwhen \"foo\" then 3\nwhen \"lalalala\" then 4\nelse 5\nend" formats "case 1\nwhen \"foo\" then 3\nwhen \"lalalala\" then 4\nelse 5\nend" formats ":&-" formats ":&-" formats "asm(\"a\" :: : : \"volatile\")" formats "asm(\"a\" :: : : \"volatile\")" formats "def foo(\n &block\n)\nend" formats "def foo(\n &block\n)\nend" formats "foo[ 1 , 2 ] =3" formats "foo[ 1 , 2 ] =3" formats "class Foo\n NamedTuple(\n a: Int32,\n )\nend" formats "class Foo\n NamedTuple(\n a: Int32,\n )\nend" formats "x : Int32*" formats "x : Int32*" formats "x : (A -> B)" formats "x : (A -> B)" formats "x 1, \\\n 2" formats "x 1, \\\n 2" formats "# Here is the doc of a method, and contains an example:\n#\n# ```\n# result = foo\n#\n# puts result\n# ```\ndef foo\n # ...\nend\n" formats "# Here is the doc of a method, and contains an example:\n#\n# ```\n# result = foo\n#\n# puts result\n# ```\ndef foo\n # ...\nend\n" formats "next 1" formats "next 1" formats "foo[x: 1, &.bar] = 1" formats "foo[x: 1, &.bar] = 1" formats "macro foo\n{% verbatim do %}1 + 2{% end %}\nend" formats "macro foo\n{% verbatim do %}1 + 2{% end %}\nend" formats "foo.bar += 2" formats "foo.bar += 2" formats "foo do\n # bar\nend" formats "foo do\n # bar\nend" formats "case 1 \n when 2 \n 3 \n when 4 \n 5 \n end" formats "case 1 \n when 2 \n 3 \n when 4 \n 5 \n end" formats "\" \" * 2" formats "\" \" * 2" formats "if 1\nelse\n2\nend\n3" formats "if 1\nelse\n2\nend\n3" formats "begin\n array[\n 0 # Zero\n ]\nend" formats "begin\n array[\n 0 # Zero\n ]\nend" formats "A = 10\nFOO = 123\nBARBAZ = 1234\n" formats "A = 10\nFOO = 123\nBARBAZ = 1234\n" formats "def foo(\n **a\n)\n 1\nend" formats "def foo(\n **a\n)\n 1\nend" formats "def foo(@[MyAnn] &); end" formats "def foo(@[MyAnn] &); end" formats "foo{|x|\n x}" formats "foo{|x|\n x}" formats "foo ( )" formats "foo ( )" formats "1 / 2" formats "1 / 2" formats "foo &.is_a?(T).bar" formats "foo &.is_a?(T).bar" formats "args.any? &.name.baz" formats "args.any? &.name.baz" formats "foo &.[a] = 1" formats "foo &.[a] = 1" formats "foo.[]" formats "foo.[]" formats "begin\n1\nensure\n2\nend" formats "begin\n1\nensure\n2\nend" formats "next {1, 2}, {3, 4}" formats "next {1, 2}, {3, 4}" formats "def bar\n foo(<<-X,\n a\n X\n 1)\nend" formats "def bar\n foo(<<-X,\n a\n X\n 1)\nend" formats "foo : Pointer(Foo)*" formats "foo : Pointer(Foo)*" formats "while true\n1\n\n# foo\nend" formats "while true\n1\n\n# foo\nend" formats "next" formats "next" formats "break 1, {2, 3}" formats "break 1, {2, 3}" formats "1 > 2" formats "1 > 2" formats "SomeLib.UppercasedFunCall 1, 2" formats "SomeLib.UppercasedFunCall 1, 2" formats "class Foo; 1; end" formats "class Foo; 1; end" formats "{/ / => / /, / / => / /}" formats "{/ / => / /, / / => / /}" formats "foo[1, &.bar] ||= 1" formats "foo[1, &.bar] ||= 1" formats "bar = foo(->{\n 1 + 2\n})" formats "bar = foo(->{\n 1 + 2\n})" formats "begin\n 1\n # Comment\n\n\nend" formats "begin\n 1\n # Comment\n\n\nend" formats "foo &.bar" formats "foo &.bar" formats "asm(\"nop\" : \"a\"(0), \"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "asm(\"nop\" : \"a\"(0), \"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "instance_alignof( Int32 )" formats "instance_alignof( Int32 )" formats "lib LibFoo\n struct Bar\n {% begin %}\n x : Int32\n {% end %}\n end\nend" formats "lib LibFoo\n struct Bar\n {% begin %}\n x : Int32\n {% end %}\n end\nend" formats "<<-FOO\nfoobar\nFOO" formats "<<-FOO\nfoobar\nFOO" formats "def foo(x) : Int32 # bar\n # baz\nend" formats "def foo(x) : Int32 # bar\n # baz\nend" formats "inner &.color=(@color)\n1" formats "inner &.color=(@color)\n1" formats "false" formats "false" formats "fun foo(\n x : Int32,\n ...\n) : Int32\n 1\nend" formats "fun foo(\n x : Int32,\n ...\n) : Int32\n 1\nend" formats "1 +\n # foo\n 2" formats "1 +\n # foo\n 2" formats "foo do | x | \n x \n end" formats "foo do | x | \n x \n end" formats "a&+1" formats "a&+1" formats "case\n# hello\nwhen 1\n 2\nend" formats "case\n# hello\nwhen 1\n 2\nend" formats "alias A = ((B(C | D) | E) | F)" formats "alias A = ((B(C | D) | E) | F)" formats "foo do # a\n # b\n bar\nend" formats "foo do # a\n # b\n bar\nend" formats "yield 1 , 2" formats "yield 1 , 2" formats "@[Foo(\n foo: 1\n)]\ndef foo\nend" formats "@[Foo(\n foo: 1\n)]\ndef foo\nend" formats "def foo : Int32\n 1\nend" formats "def foo : Int32\n 1\nend" formats "[\n1, # a\n2, # b\n 3 # c\n]" formats "[\n1, # a\n2, # b\n 3 # c\n]" formats "if 0\n1 &&\n2 &&\n3\nend" formats "if 0\n1 &&\n2 &&\n3\nend" formats "def foo(\n\n#foo\nx,\n\n#bar\nz\n)\nend" formats "def foo(\n\n#foo\nx,\n\n#bar\nz\n)\nend" formats "foo &.==(2)" formats "foo &.==(2)" formats "foo(<<-X,\na\nX\n 1)" formats "foo(<<-X,\na\nX\n 1)" formats "def foo(a : T, b : U) forall T, U #\n #\nend" formats "def foo(a : T, b : U) forall T, U #\n #\nend" formats "[\n1,\n2,\n3]" formats "[\n1,\n2,\n3]" formats "unless a\n2\n3\nend" formats "unless a\n2\n3\nend" formats "enum Foo : Int32\nA = 1\nend" formats "enum Foo : Int32\nA = 1\nend" formats "Foo" formats "Foo" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" : \"volatile\" , \"alignstack\" )" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" : \"volatile\" , \"alignstack\" )" formats "def foo( @[MyAnn] v ); end" formats "def foo( @[MyAnn] v ); end" formats "def foo\n@x : Int32\nend" formats "def foo\n@x : Int32\nend" formats "@x : A(B | C)?" formats "@x : A(B | C)?" formats "\"\\a\\c\\b\\d\"" formats "\"\\a\\c\\b\\d\"" formats "select # some comment\nwhen bar\n break\nend" formats "select # some comment\nwhen bar\n break\nend" formats "asm(\"nop\" : \"a\"(0),\n\"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "asm(\"nop\" : \"a\"(0),\n\"b\"(1)\n: \"c\"(2), \"d\"(3) )" formats "foo(1, # foo\n &.bar)" formats "foo(1, # foo\n &.bar)" formats "foo (1; 2)" formats "foo (1; 2)" formats "$1" formats "$1" formats "-> : Int32 { }" formats "-> : Int32 { }" formats "`foo`" formats "`foo`" formats "foo &.bar( 1 , 2 )" formats "foo &.bar( 1 , 2 )" formats "1.=== { 3 }" formats "1.=== { 3 }" formats "1+2*3" formats "1+2*3" formats "module Foo # foo\nend" formats "module Foo # foo\nend" formats "case 1\nend" formats "case 1\nend" formats "{% begin %}\n \"\n foo\"\n{% end %}" formats "{% begin %}\n \"\n foo\"\n{% end %}" formats "->(x : Int32) {}" formats "->(x : Int32) {}" formats "foo(\n [\n 1,\n 2,\n ],\n [\n 3,\n 4,\n ]\n)" formats "foo(\n [\n 1,\n 2,\n ],\n [\n 3,\n 4,\n ]\n)" formats "foo = 1\n->foo.foo?" formats "foo = 1\n->foo.foo?" formats "{% if true %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "{% if true %}\n <<-FOO\n hello \n FOO\n{% end %}" formats " <<-HTML\n \#{1}\n HTML" formats " <<-HTML\n \#{1}\n HTML" formats "1.<= do\nend" formats "1.<= do\nend" formats " {{ 1 + 2 }}" formats " {{ 1 + 2 }}" formats "foo((1..3))" formats "foo((1..3))" formats "foo(1 &- 2)" formats "foo(1 &- 2)" formats "x\n# foo\n\n# bar" formats "x\n# foo\n\n# bar" formats "macro foo\n {% if 1 %} 2 {% elsif 3 %} 4 {% else %} 5 {% end %}\nend" formats "macro foo\n {% if 1 %} 2 {% elsif 3 %} 4 {% else %} 5 {% end %}\nend" formats "def foo ( @@select) \n end" formats "def foo ( @@select) \n end" formats "def foo(x = __FILE__ )\nend" formats "def foo(x = __FILE__ )\nend" formats "foo{}" formats "foo{}" formats "foo . responds_to? :bar" formats "foo . responds_to? :bar" formats "-> :: foo" formats "-> :: foo" formats "foo {;1}" formats "foo {;1}" formats "1 #=> 2" formats "1 #=> 2" formats "def foo(**z)\nend" formats "def foo(**z)\nend" formats "->{}" formats "->{}" formats "{% if 1 %}\n 2\n{% end %}\ndef foo\nend" formats "{% if 1 %}\n 2\n{% end %}\ndef foo\nend" formats "foo &.@bar" formats "foo &.@bar" formats "def foo(@[MyAnn] &block); end" formats "def foo(@[MyAnn] &block); end" formats "{ 1 => 2 ,\n 3 => 4 }" formats "{ 1 => 2 ,\n 3 => 4 }" formats "foo.[]" formats "foo.[]" formats "foo 1, a: 1,\nb: 2,\nc: 3,\n&block" formats "foo 1, a: 1,\nb: 2,\nc: 3,\n&block" formats "1 == / /" formats "1 == / /" formats "macro []=(x, y)\nend" formats "macro []=(x, y)\nend" formats "{%\n if true\n 1\n else\n 2\n end\n%}" formats "{%\n if true\n 1\n else\n 2\n end\n%}" formats "foo : Foo*****" formats "foo : Foo*****" formats "foo &.[]=(1, 2)" formats "foo &.[]=(1, 2)" formats "foo . bar()" formats "foo . bar()" formats "begin; 1; end" formats "begin; 1; end" formats "def foo(\n **a\n\n # comment\n)\n 1\nend" formats "def foo(\n **a\n\n # comment\n)\n 1\nend" formats "\n\n1" formats "\n\n1" formats "foo &.responds_to?(:foo).bar" formats "foo &.responds_to?(:foo).bar" formats "case 1\nend" formats "case 1\nend" formats "x = <<-FOO\n hello\n FOO\n\ndef bar\nend" formats "x = <<-FOO\n hello\n FOO\n\ndef bar\nend" formats "enum Foo;end" formats "enum Foo;end" formats "if 1\n [\n 1,\n ].none?\nend" formats "if 1\n [\n 1,\n ].none?\nend" formats "page= <<-HTML\n foo\nHTML" formats "page= <<-HTML\n foo\nHTML" formats "def foo\n 1\n # Comment\n\n\nend" formats "def foo\n 1\n # Comment\n\n\nend" formats "macro foo\n 1 + 2\nend" formats "macro foo\n 1 + 2\nend" formats "class Foo\n@x : Int32\nend" formats "class Foo\n@x : Int32\nend" formats "[\n {\n 1 => 2,\n }, {\n 3 => 4,\n }, {\n 5 => 6,\n },\n]" formats "[\n {\n 1 => 2,\n }, {\n 3 => 4,\n }, {\n 5 => 6,\n },\n]" formats "<<-HTML\n \#{\"foo\"}\n HTML" formats "<<-HTML\n \#{\"foo\"}\n HTML" formats "A = 1\nFOO = 2\n\nEX = 3" formats "A = 1\nFOO = 2\n\nEX = 3" formats "break 1 , 2" formats "break 1 , 2" formats "'\\u{0123}'" formats "'\\u{0123}'" formats "def foo(@[MyAnn] v); end" formats "def foo(@[MyAnn] v); end" formats "\"foo\" \\\n \"bar\" \\\n \"baz\"" formats "\"foo\" \\\n \"bar\" \\\n \"baz\"" formats " <<-HTML\n \#{1} \#{2}\n HTML" formats " <<-HTML\n \#{1} \#{2}\n HTML" formats "10/a" formats "10/a" formats "yield" formats "yield" formats "while 1\n2\nend" formats "while 1\n2\nend" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\",\n \"g\")" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\",\n \"g\")" formats "def foo\n {% for x in y %}\n foo + bar\n {% end %}\nend" formats "def foo\n {% for x in y %}\n foo + bar\n {% end %}\nend" formats "lib Foo\nfun foo(x : Int32, ... ) : Int32\nend" formats "lib Foo\nfun foo(x : Int32, ... ) : Int32\nend" formats "[] of Int32\n1" formats "[] of Int32\n1" formats "case 1\nwhen 1 then\n2\nwhen 3\n4\nend" formats "case 1\nwhen 1 then\n2\nwhen 3\n4\nend" formats "foo.bar # comment\n .baz" formats "foo.bar # comment\n .baz" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\n # comment\nend" formats "lib Foo\n fun foo =\n \"bar\"(Int32) : Int32\n # comment\nend" formats "foo[ 1 , 2 ]" formats "foo[ 1 , 2 ]" formats "coco.lala\nfoo\n .bar" formats "coco.lala\nfoo\n .bar" formats "1_234" formats "1_234" formats "enum Foo\n A; B; C\nend\n" formats "enum Foo\n A; B; C\nend\n" formats "if 1\n# nothing\nend" formats "if 1\n# nothing\nend" formats "yield( *1 , *2 )" formats "yield( *1 , *2 )" formats "def a\n b(\n 1, # x\n # y\n 2\n )\nend" formats "def a\n b(\n 1, # x\n # y\n 2\n )\nend" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n bar => <<-BAR,\n bar\n BAR\n}" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n bar => <<-BAR,\n bar\n BAR\n}" formats "X(typeof(begin\n e.is_a?(Y)\nend))" formats "X(typeof(begin\n e.is_a?(Y)\nend))" formats "if 1\nelse\n2 # foo\nend" formats "if 1\nelse\n2 # foo\nend" formats "lib Foo\nstruct Foo\nx : Int32\nend\nend" formats "lib Foo\nstruct Foo\nx : Int32\nend\nend" formats "foo(1, / /)" formats "foo(1, / /)" formats "foo(self // 1)" formats "foo(self // 1)" formats "foo.as ( Int32* )" formats "foo.as ( Int32* )" formats "def foo(x)\n self // x\nend" formats "def foo(x)\n self // x\nend" formats "{ {1 => 2} }" formats "{ {1 => 2} }" formats "[1, 2, 3]" formats "[1, 2, 3]" formats "@[::Foo::Bar]" formats "@[::Foo::Bar]" formats "$1?" formats "$1?" formats "1.==(2) { 3 }" formats "1.==(2) { 3 }" formats "asm(\"nop\" : : )" formats "asm(\"nop\" : : )" formats "begin\n a\nend.b { }\nc" formats "begin\n a\nend.b { }\nc" formats "yield(\n1 , \n2)" formats "yield(\n1 , \n2)" formats "foo(1 &+ \n2)" formats "foo(1 &+ \n2)" formats "if 1\n[\n a() # b\n]\nend" formats "if 1\n[\n a() # b\n]\nend" formats "-> : Int32 | String { 1 }" formats "-> : Int32 | String { 1 }" formats "def foo(a : T) forall T\n #\n\nend" formats "def foo(a : T) forall T\n #\n\nend" formats "return {1, 2}, {3, 4}" formats "return {1, 2}, {3, 4}" formats "macro foo\n {% if true %}if true{% end %}\n {% if true %}end{% end %}\nend" formats "macro foo\n {% if true %}if true{% end %}\n {% if true %}end{% end %}\nend" formats "1 unless 2" formats "1 unless 2" formats "foo 1, # comment\n do\n end" formats "foo 1, # comment\n do\n end" formats "def foo(x)\n case self // x\n when 2\n 3\n end\nend" formats "def foo(x)\n case self // x\n when 2\n 3\n end\nend" formats "1#foo" formats "1#foo" formats "1 + \\\n2" formats "1 + \\\n2" formats "<<-FOO\n1\nFOO\n\n{\n 1 => 2,\n 10 => 3,\n}" formats "<<-FOO\n1\nFOO\n\n{\n 1 => 2,\n 10 => 3,\n}" formats "foo(\n1,\n 2 \n)" formats "foo(\n1,\n 2 \n)" formats "asm(\"nop\" :::: \"volatile\" )" formats "asm(\"nop\" :::: \"volatile\" )" formats "lib Bar\n enum Foo\n end\nend" formats "lib Bar\n enum Foo\n end\nend" formats "::StaticArray(T)" formats "::StaticArray(T)" formats "[\n# foo\n] of String" formats "[\n# foo\n] of String" formats "->( ){ x }" formats "->( ){ x }" formats "macro foo(x)\n {% if 1 %} 2 {% end %}\nend" formats "macro foo(x)\n {% if 1 %} 2 {% end %}\nend" formats "next { {1, 2}, {3, 4} }, 5" formats "next { {1, 2}, {3, 4} }, 5" formats "foo(a: 1 // 2)" formats "foo(a: 1 // 2)" formats "macro foo\n {% 1 + 2 %}\nend" formats "macro foo\n {% 1 + 2 %}\nend" formats "foo\n .bar(\n 1\n )" formats "foo\n .bar(\n 1\n )" formats "[\n <<-EOF,\n foo\n EOF\n <<-BAR,\n bar\n BAR\n]" formats "[\n <<-EOF,\n foo\n EOF\n <<-BAR,\n bar\n BAR\n]" formats "-> : {Int32} { String }" formats "-> : {Int32} { String }" formats "1 \\\nif 2" formats "1 \\\nif 2" formats "def foo\n 1 #\nrescue\nend" formats "def foo\n 1 #\nrescue\nend" formats "1.===() { 3 }" formats "1.===() { 3 }" formats "1 # foo\n2 # bar" formats "1 # foo\n2 # bar" formats "1\n..2" formats "1\n..2" formats "if 1;\n2;\nelsif 3;\n4;\nend" formats "if 1;\n2;\nelsif 3;\n4;\nend" formats "if a\n # hello\n 2\nend" formats "if a\n # hello\n 2\nend" formats "String???" formats "String???" formats "foo.bar &.baz( 1 , 2 )" formats "foo.bar &.baz( 1 , 2 )" formats "page= <<-HTML\n \#{1}foo\nHTML" formats "page= <<-HTML\n \#{1}foo\nHTML" formats "-> :: Foo . foo!" formats "-> :: Foo . foo!" formats "" formats "" formats "$1.bar" formats "$1.bar" formats "def foo ( x : self ) \n end" formats "def foo ( x : self ) \n end" formats "yield 1 , \n2" formats "yield 1 , \n2" formats "lib Foo\nfun foo(x : Int32, y : Float64) : Int32\nend" formats "lib Foo\nfun foo(x : Int32, y : Float64) : Int32\nend" formats "{% if true %}\n # x\n # y\n{% end %}" formats "{% if true %}\n # x\n # y\n{% end %}" formats "bar do\n call(foo <<-X\n bar\n X\n )\nend" formats "bar do\n call(foo <<-X\n bar\n X\n )\nend" formats "if 1\nbegin\n2\nensure\n3\nend\nend" formats "if 1\nbegin\n2\nensure\n3\nend\nend" formats "[1, 2,\n 3, 4]\n" formats "[1, 2,\n 3, 4]\n" formats "class Foo\n@x : Int32\nend" formats "class Foo\n@x : Int32\nend" formats "/foo/" formats "/foo/" formats "return {1, 2}, 3" formats "return {1, 2}, 3" formats "alias Foo= Bar" formats "alias Foo= Bar" formats "foo( 1 , 2 )" formats "foo( 1 , 2 )" formats "foo(->do\n 1 + 2\nend)" formats "foo(->do\n 1 + 2\nend)" formats "yield(1 , \n2)" formats "yield(1 , \n2)" formats "@foo : Int32 # comment\n\ndef foo\nend" formats "@foo : Int32 # comment\n\ndef foo\nend" formats "# ```\n# macro foo\n# 1\n# end\n# ```\n" formats "# ```\n# macro foo\n# 1\n# end\n# ```\n" formats "{ } of A => B" formats "{ } of A => B" formats "foo(\n # foo\n1,\n\n # bar\n2, \n)" formats "foo(\n # foo\n1,\n\n # bar\n2, \n)" formats "-> : Int32 {}" formats "-> : Int32 {}" formats "-> { }" formats "-> { }" formats "x : {A, B}" formats "x : {A, B}" formats "a = case 1\nwhen 2\n3\nelse\n4\nend" formats "a = case 1\nwhen 2\n3\nelse\n4\nend" formats "1 && (\n 2 || 3\n)" formats "1 && (\n 2 || 3\n)" formats "break *1 ,2" formats "break *1 ,2" formats "case 0\nwhen 0 then 1; 2\n# Comments\nend" formats "case 0\nwhen 0 then 1; 2\n# Comments\nend" formats "foo do\n [foo <<-X\n bar\n X\n ]\nend" formats "foo do\n [foo <<-X\n bar\n X\n ]\nend" formats "p = Foo[1, 2, 3,\n 4, 5, 6,\n ]" formats "p = Foo[1, 2, 3,\n 4, 5, 6,\n ]" formats "macro foo()\nend" formats "macro foo()\nend" formats "@[Foo( 1, 2, foo: 3 )]" formats "@[Foo( 1, 2, foo: 3 )]" formats "foo &.bar.nil?()" formats "foo &.bar.nil?()" formats "def foo(a : T) forall T \n #\nend" formats "def foo(a : T) forall T \n #\nend" formats "1 if 2" formats "1 if 2" formats "def foo ( x = 1 ) \n end" formats "def foo ( x = 1 ) \n end" formats "case 1 \n when 2 then 3 \n end" formats "case 1 \n when 2 then 3 \n end" formats "{ foo: 1 }" formats "{ foo: 1 }" formats "foo : self?" formats "foo : self?" formats "a = foo(bar([\n 1,\n]))" formats "a = foo(bar([\n 1,\n]))" formats "case 1\nelse # foo\n # bar\nend" formats "case 1\nelse # foo\n # bar\nend" formats "foo[1, &.bar] = 1" formats "foo[1, &.bar] = 1" formats "def foo \n end" formats "def foo \n end" formats "/foo \#{ bar }/" formats "/foo \#{ bar }/" formats "join io, &.inspect" formats "join io, &.inspect" formats "def foo\n 1 #\nrescue\nend" formats "def foo\n 1 #\nrescue\nend" formats "1 #=>2" formats "1 #=>2" formats "->{}" formats "->{}" formats "'a'" formats "'a'" formats "def a\n b(\n 1, # x\n # y\n )\nend" formats "def a\n b(\n 1, # x\n # y\n )\nend" formats "{% foo <<-X\nbar\nX\n%}" formats "{% foo <<-X\nbar\nX\n%}" formats "FOO = 2 + 3\nA = 1 - 10" formats "FOO = 2 + 3\nA = 1 - 10" formats "if 1\nelse\n# nothing\nend" formats "if 1\nelse\n# nothing\nend" formats "require \"foo\"" formats "require \"foo\"" formats "-> : Int32? {}" formats "-> : Int32? {}" formats "1 # foo" formats "1 # foo" formats "foo[&.bar]" formats "foo[&.bar]" formats "foo[ 1, 2 ]?" formats "foo[ 1, 2 ]?" formats "yield 1\n2" formats "yield 1\n2" formats "def foo(**b, # comment\n &block)\nend" formats "def foo(**b, # comment\n &block)\nend" formats "1.== { 3 }" formats "1.== { 3 }" formats "->{1}" formats "->{1}" formats "Tuple()" formats "Tuple()" formats "def foo\n {{@type}}\nend" formats "def foo\n {{@type}}\nend" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\#{foo}\\v\\f\\e\"" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\#{foo}\\v\\f\\e\"" formats "macro foo\nend" formats "macro foo\nend" formats "class Bar\nprotected def foo(x)\na=b(c)\nend\nend" formats "class Bar\nprotected def foo(x)\na=b(c)\nend\nend" formats "def foo ( x ) : Int32 \n end" formats "def foo ( x ) : Int32 \n end" formats "{ {1, 2, 3} }" formats "{ {1, 2, 3} }" formats "private FOO = 2\nprivate A = 1" formats "private FOO = 2\nprivate A = 1" formats "foo &.bar" formats "foo &.bar" formats "[] of (((Array(T))))" formats "[] of (((Array(T))))" formats "class Foo ( T )\nend" formats "class Foo ( T )\nend" formats "<<-HTML\n foo\n \#{\"foo\"}\n HTML" formats "<<-HTML\n foo\n \#{\"foo\"}\n HTML" formats "@x &&= 1" formats "@x &&= 1" formats "return { 1 , 2 }" formats "return { 1 , 2 }" formats "def foo : self | Nil\n nil\nend" formats "def foo : self | Nil\n nil\nend" formats "def foo : Int32 \n end" formats "def foo : Int32 \n end" formats "a &.a.!" formats "a &.a.!" formats "{\n \"a\" => 1, \"b\" => 2,\n \"foo\" => 3, \"bar\" => 4,\n \"coconio\" => 5, \"lala\" => 6,\n}\n" formats "{\n \"a\" => 1, \"b\" => 2,\n \"foo\" => 3, \"bar\" => 4,\n \"coconio\" => 5, \"lala\" => 6,\n}\n" formats "macro foo\n %foo{x,y}\nend" formats "macro foo\n %foo{x,y}\nend" formats "if 1\n return foo(\n 1,\n 2,\n )\nend" formats "if 1\n return foo(\n 1,\n 2,\n )\nend" formats "def foo(\n a,\n &block\n)\nend" formats "def foo(\n a,\n &block\n)\nend" formats "lib Foo\nunion Foo\nend\nend" formats "lib Foo\nunion Foo\nend\nend" formats "def foo(\n foo,\n @[MyAnn] &block\n); end" formats "def foo(\n foo,\n @[MyAnn] &block\n); end" formats "->@foo.foo!" formats "->@foo.foo!" formats "if 1\n1\n\n# foo\nend" formats "if 1\n1\n\n# foo\nend" formats "def foo(x)\n {% if true %}\n \\{% if true %}\n x = 1\n \\{% else %}\n x = 2\n \\{% end %}\n \\{% for x in y %}\n x = 1\n \\{% end %}\n \\{{x}}\n \\{% x %}\n {% end %}\nend" formats "def foo(x)\n {% if true %}\n \\{% if true %}\n x = 1\n \\{% else %}\n x = 2\n \\{% end %}\n \\{% for x in y %}\n x = 1\n \\{% end %}\n \\{{x}}\n \\{% x %}\n {% end %}\nend" formats "asm(\"nop\" :::: \"volatile\" , \"alignstack\" , \"intel\" )" formats "asm(\"nop\" :::: \"volatile\" , \"alignstack\" , \"intel\" )" formats "1" formats "1" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1),\n\"c\"(2) )" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1),\n\"c\"(2) )" formats "def foo\nend\ndef bar\nend" formats "def foo\nend\ndef bar\nend" formats "{% verbatim do %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "{% verbatim do %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "x : {A, B, }" formats "x : {A, B, }" formats "->@@foo.foo" formats "->@@foo.foo" formats "a &.b.as(C)" formats "a &.b.as(C)" formats "return { {1, 2}, {3, 4} }, 5" formats "return { {1, 2}, {3, 4} }, 5" formats "macro foo\n %foo\nend" formats "macro foo\n %foo\nend" formats "def foo( x , & : Int32 )\nend" formats "def foo( x , & : Int32 )\nend" formats "foo.@bar" formats "foo.@bar" formats "foo = 1\n->foo.bar(Int32)" formats "foo = 1\n->foo.bar(Int32)" formats "->@@foo.foo=" formats "->@@foo.foo=" formats "macro foo\n {{1 + 2}}\nend" formats "macro foo\n {{1 + 2}}\nend" formats "foo.[] =1" formats "foo.[] =1" formats "macro foo\n <<-FOO\n hello \n FOO\nend" formats "macro foo\n <<-FOO\n hello \n FOO\nend" formats "foo ()" formats "foo ()" formats "foo(/ /)" formats "foo(/ /)" formats "alias A = ( A | B )" formats "alias A = ( A | B )" formats "foo do\n {% foo <<-X\n bar\n X\n %}\nend" formats "foo do\n {% foo <<-X\n bar\n X\n %}\nend" formats "Foo( A , 1 )" formats "Foo( A , 1 )" formats "if 1\n[ 1 , 2 , 3 ]\nend" formats "if 1\n[ 1 , 2 , 3 ]\nend" formats "return( 1 , 2 )" formats "return( 1 , 2 )" formats "[\n a(),\n]" formats "[\n a(),\n]" formats " [ 1, \n 2 , \n 3 ] " formats " [ 1, \n 2 , \n 3 ] " formats "a(&.b.c.as C)" formats "a(&.b.c.as C)" formats "foo[x: 1, &.bar] ||= 1" formats "foo[x: 1, &.bar] ||= 1" formats " _ , *_ ,\na.foo ,a.bar = 1 , 2,3" formats " _ , *_ ,\na.foo ,a.bar = 1 , 2,3" formats "as? Foo" formats "as? Foo" formats "(size - 1).downto(0) do |i|\n yield @buffer[i]\nend" formats "(size - 1).downto(0) do |i|\n yield @buffer[i]\nend" formats "lib Bar\n enum Foo\n A\n end\nend" formats "lib Bar\n enum Foo\n A\n end\nend" formats "if 1\n {% if 2 %} {% end %}\nend" formats "if 1\n {% if 2 %} {% end %}\nend" formats "begin\n ()\nend" formats "begin\n ()\nend" formats "begin\n array[\n 0, # Zero\n ]\nend" formats "begin\n array[\n 0, # Zero\n ]\nend" formats "yield (1).foo" formats "yield (1).foo" formats "1 ; 2" formats "1 ; 2" formats "unless a\n # hello\n 2\nend" formats "unless a\n # hello\n 2\nend" formats "alias X = (A, B) ->\nbar : C" formats "alias X = (A, B) ->\nbar : C" formats "begin\n 1\nend\n\n1\n" formats "begin\n 1\nend\n\n1\n" formats "[\n # foo\n] of String" formats "[\n # foo\n] of String" formats "foo{|x| x}" formats "foo{|x| x}" formats "1 && 2" formats "1 && 2" formats "->( x )\n:\nInt32 { }" formats "->( x )\n:\nInt32 { }" formats "if a\n2\nelse\nend" formats "if a\n2\nelse\nend" formats "class Foo # foo\nend" formats "class Foo # foo\nend" formats "foo = 1\n->foo.[](Int32)" formats "foo = 1\n->foo.[](Int32)" formats "a.b &.[c]?\n1" formats "a.b &.[c]?\n1" formats "def foo( x , & block : Int32 )\nend" formats "def foo( x , & block : Int32 )\nend" formats "1.>=(2) { 3 }" formats "1.>=(2) { 3 }" formats "as Foo" formats "as Foo" formats "~ 1" formats "~ 1" formats "asm(\"a\" : : :: \"volatile\")" formats "asm(\"a\" : : :: \"volatile\")" formats "\"foo \#{ __DIR__ }\"" formats "\"foo \#{ __DIR__ }\"" formats "asm(\"nop\")" formats "asm(\"nop\")" formats "foo . bar" formats "foo . bar" formats "-> { 1 }" formats "-> { 1 }" formats "with foo yield bar" formats "with foo yield bar" formats "asm(\"nop\" : \"a\"(0), \"b\"(1) )" formats "asm(\"nop\" : \"a\"(0), \"b\"(1) )" formats "->() do x end" formats "->() do x end" formats "foo.[] = 1" formats "foo.[] = 1" formats "\"\#{\n foo = 1}\"" formats "\"\#{\n foo = 1}\"" formats "Foo( x: Int32 , y: Float64 )" formats "Foo( x: Int32 , y: Float64 )" formats "foo &.[](1, 2)" formats "foo &.[](1, 2)" formats "a = 1 + # foo\n2" formats "a = 1 + # foo\n2" formats "macro foo\n {{\n1 + 2 }}\nend" formats "macro foo\n {{\n1 + 2 }}\nend" formats "def foo\nend;def bar\nend" formats "def foo\nend;def bar\nend" formats "foo(\n 1,\n &.foo\n)" formats "foo(\n 1,\n &.foo\n)" formats "begin\n begin\n\n end\nend" formats "begin\n begin\n\n end\nend" formats ":\"foo\"" formats ":\"foo\"" formats "foo.bar / 2\n" formats "foo.bar / 2\n" formats "struct Foo(T)\n# bar\n1\nend" formats "struct Foo(T)\n# bar\n1\nend" formats "case\nelse\n 1\nend" formats "case\nelse\n 1\nend" formats "Set{ # foo\n 1,\n}" formats "Set{ # foo\n 1,\n}" formats "alias A = (B)" formats "alias A = (B)" formats "1 ? 2 : 3" formats "1 ? 2 : 3" formats "long_variable_name = [{\n :foo => 1,\n}, {\n :bar => 2,\n}]" formats "long_variable_name = [{\n :foo => 1,\n}, {\n :bar => 2,\n}]" formats "module Readline\n @@completion_proc : (String -> Array(String)?) | (String -> Array(String)) | Nil\nend" formats "module Readline\n @@completion_proc : (String -> Array(String)?) | (String -> Array(String)) | Nil\nend" formats "foo &.as?(T).bar" formats "foo &.as?(T).bar" formats "x: Int32" formats "x: Int32" formats "->: Int32 do\nx\nend" formats "->: Int32 do\nx\nend" formats "x : Int32" formats "x : Int32" formats "begin\n1 ? 2 : 3\nend" formats "begin\n1 ? 2 : 3\nend" formats "responds_to? :foo" formats "responds_to? :foo" formats "<<-HTML\n hello \n world \n HTML" formats "<<-HTML\n hello \n world \n HTML" formats "foo(\n 1, # hola\n2, # chau\n )" formats "foo(\n 1, # hola\n2, # chau\n )" formats "/ /" formats "/ /" formats "a = 1\ndef bar\nend" formats "a = 1\ndef bar\nend" formats "def foo\n {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}\nend" formats "def foo\n {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}\nend" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" )" formats "asm(\"nop\" ::: \"eax\" , \"ebx\" )" formats "1.== do\nend" formats "1.== do\nend" formats "foo a: 1\nb" formats "foo a: 1\nb" formats "enum Foo\n A = 10\n FOO = 123\n BARBAZ = 1234\nend\n" formats "enum Foo\n A = 10\n FOO = 123\n BARBAZ = 1234\nend\n" formats "\"\\a\\c\#{foo}\\b\\d\"" formats "\"\\a\\c\#{foo}\\b\\d\"" formats "break *1 , *2" formats "break *1 , *2" formats "def foo ( bar @select) \n end" formats "def foo ( bar @select) \n end" formats "asm(\"a\" : \"b\"(c)\n)" formats "asm(\"a\" : \"b\"(c)\n)" formats "foo 1,\n2" formats "foo 1,\n2" formats "def foo(a : T) forall T\n #\n\n\nend" formats "def foo(a : T) forall T\n #\n\n\nend" formats "def foo\na = bar do\n1\nend\nend" formats "def foo\na = bar do\n1\nend\nend" formats "case foo\nwhen 1\n # A\nelse\n# B\nend\n" formats "case foo\nwhen 1\n # A\nelse\n# B\nend\n" formats "x = <<-EOF\n 1\nEOF" formats "x = <<-EOF\n 1\nEOF" formats "a-1" formats "a-1" adds trailing comma to def multi-line normal, splat, and double splat parameters formats "def foo(\n a,\n)\nend" formats "def foo(\n a,\n)\nend" formats "def foo(\n a : Int32,\n b : Int32 = 1\n)\nend" formats "def foo(\n a : Int32,\n b : Int32 = 1\n)\nend" formats "macro foo(\n a,\n b\n)\nend" formats "macro foo(\n a,\n b\n)\nend" formats "def foo(\n a,\n b c\n)\nend" formats "def foo(\n a,\n b c\n)\nend" formats "def foo(a, &block)\nend" formats "def foo(a, &block)\nend" formats "def foo(\n a,\n &block\n)\nend" formats "def foo(\n a,\n &block\n)\nend" formats "def foo(\n a,\n *b\n)\nend" formats "def foo(\n a,\n *b\n)\nend" formats "def foo(\n a,\n @[Ann] b\n)\nend" formats "def foo(\n a,\n @[Ann] b\n)\nend" formats "def foo(\n a : Int32,\n b : Int32\n)\nend" formats "def foo(\n a : Int32,\n b : Int32\n)\nend" formats "def foo(a, *args)\nend" formats "def foo(a, *args)\nend" formats "def foo(a)\nend" formats "def foo(a)\nend" formats "def foo(a, b)\nend" formats "def foo(a, b)\nend" formats "def foo(a, **kwargs)\nend" formats "def foo(a, **kwargs)\nend" formats "macro foo(\n a,\n *b\n)\nend" formats "macro foo(\n a,\n *b\n)\nend" formats "def foo(\n a,\n @[Ann]\n b\n)\nend" formats "def foo(\n a,\n @[Ann]\n b\n)\nend" formats "fun foo(\n a : Int32,\n ...\n)\nend" formats "fun foo(\n a : Int32,\n ...\n)\nend" formats "fun foo(\n a : Int32,\n b : Int32\n)\nend" formats "fun foo(\n a : Int32,\n b : Int32\n)\nend" formats "def foo(\n a, b,\n c, d\n)\nend" formats "def foo(\n a, b,\n c, d\n)\nend" formats "def foo(\n a,\n b\n)\nend" formats "def foo(\n a,\n b\n)\nend" formats "def foo(\n a, # Foo\n b # Bar\n)\nend" formats "def foo(\n a, # Foo\n b # Bar\n)\nend" formats "def foo(a, *args, &block)\nend" formats "def foo(a, *args, &block)\nend" formats "def foo(\n a, b\n)\nend" formats "def foo(\n a, b\n)\nend" formats "def foo(\n a,\n **b\n)\nend" formats "def foo(\n a,\n **b\n)\nend" formats "def foo(a, **kwargs, &block)\nend" formats "def foo(a, **kwargs, &block)\nend" formats "<<-HTML\n \#{1}x\n HTML" formats "<<-HTML\n \#{1}x\n HTML" formats "case 1 \n when 2 then \n 3 \n end" formats "case 1 \n when 2 then \n 3 \n end" formats "a = foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "a = foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "\"foo\#{\"bar\"} Baz \#{\"qux\"} \"" formats "\"foo\#{\"bar\"} Baz \#{\"qux\"} \"" formats "foo[1, &.bar]?" formats "foo[1, &.bar]?" formats "is_a? Foo" formats "is_a? Foo" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] @[MyAnn] baz,\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] @[MyAnn] baz,\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "case 1\nwhen a; 2\nelse; b\nend" formats "case 1\nwhen a; 2\nelse; b\nend" formats "def foo : A | B(C)\n nil\nend" formats "def foo : A | B(C)\n nil\nend" formats "def foo(\n a,\n b\n)\nend" formats "def foo(\n a,\n b\n)\nend" formats ":/" formats ":/" formats "asm(\n\"nop\" : \"a\"(0), \"b\"(1) )" formats "asm(\n\"nop\" : \"a\"(0), \"b\"(1) )" formats "begin\n / /\nend" formats "begin\n / /\nend" formats "class Actor\n macro inherited\n\nend\nend\n" formats "class Actor\n macro inherited\n\nend\nend\n" formats " {%\na = 1 %}" formats " {%\na = 1 %}" formats ":^" formats ":^" formats "yield *1 , *2" formats "yield *1 , *2" formats "def foo ( @select) \n end" formats "def foo ( @select) \n end" formats "->\n:\nInt32\n{\n}" formats "->\n:\nInt32\n{\n}" formats "foo . is_a? ( Bar )" formats "foo . is_a? ( Bar )" formats "def foo(\n **a # comment\n)\n 1\nend" formats "def foo(\n **a # comment\n)\n 1\nend" formats "lib LibFoo\n {% begin %}\n fun x = y(Int32)\n {% end %}\nend" formats "lib LibFoo\n {% begin %}\n fun x = y(Int32)\n {% end %}\nend" formats "a = begin\n 1\nend\n\na =\nbegin\n 1\nend\n\na = if 1\n 2\nend\n\nb = 1\nb ||= begin\n 2\nend\n\nb ||= if 1\n 2\nend\n\nb += if 1\n 2\nend\n\nb +=\nif 1\n 2\nend\n\na, b = begin\n 1\nend\n\na, b =\nbegin\n 1\nend\n\nc[x] = begin\n 2\nend\n\nc[x] =\nbegin\n 2\nend\n\nc[x] = if 1\n 2\nend\n\nc[x] ||= begin 1\n 2\nend\n\nc[x] ||= if 1\n 2\nend\n\nc[x] += if 1\n 2\nend\n\nc[x] += begin 1\n 2\nend\n\nc[x] +=\nbegin\n 1\n 2\nend\n\nfoo.bar = begin\nend\n\nfoo.bar =\nbegin\nend\n\nfoo.bar = if\n 2\nend\n\nfoo.bar += begin\n 2\nend\n\nfoo.bar += if\n 2\nend\n\n" formats "a = begin\n 1\nend\n\na =\nbegin\n 1\nend\n\na = if 1\n 2\nend\n\nb = 1\nb ||= begin\n 2\nend\n\nb ||= if 1\n 2\nend\n\nb += if 1\n 2\nend\n\nb +=\nif 1\n 2\nend\n\na, b = begin\n 1\nend\n\na, b =\nbegin\n 1\nend\n\nc[x] = begin\n 2\nend\n\nc[x] =\nbegin\n 2\nend\n\nc[x] = if 1\n 2\nend\n\nc[x] ||= begin 1\n 2\nend\n\nc[x] ||= if 1\n 2\nend\n\nc[x] += if 1\n 2\nend\n\nc[x] += begin 1\n 2\nend\n\nc[x] +=\nbegin\n 1\n 2\nend\n\nfoo.bar = begin\nend\n\nfoo.bar =\nbegin\nend\n\nfoo.bar = if\n 2\nend\n\nfoo.bar += begin\n 2\nend\n\nfoo.bar += if\n 2\nend\n\n" formats "@x[ 1 ] ||= 2" formats "@x[ 1 ] ||= 2" formats "class Foo ( *T, U )\nend" formats "class Foo ( *T, U )\nend" formats "while 1 # foo\nend" formats "while 1 # foo\nend" formats ":&+" formats ":&+" formats "asm(\"a\" :: \"d\"(e)\n)" formats "asm(\"a\" :: \"d\"(e)\n)" formats "/foo/imx" formats "/foo/imx" formats "def foo(a,\n *b)\nend" formats "def foo(a,\n *b)\nend" formats "foo = 1\n->foo.foo=" formats "foo = 1\n->foo.foo=" formats "1.==() { 3 }" formats "1.==() { 3 }" formats "lib Foo\nstruct Foo\nx , y : Int32\nend\nend" formats "lib Foo\nstruct Foo\nx , y : Int32\nend\nend" formats " .. 2" formats " .. 2" formats "a = if 1\n2\nelsif 3\n4\nend" formats "a = if 1\n2\nelsif 3\n4\nend" formats "a.!" formats "a.!" formats "begin\n1\nrescue ex\n3\nend" formats "begin\n1\nrescue ex\n3\nend" formats "\"foo \#{ 1 + 2 }\"" formats "\"foo \#{ 1 + 2 }\"" formats "foo do\n {{ foo <<-X\n bar\n X\n }}\nend" formats "foo do\n {{ foo <<-X\n bar\n X\n }}\nend" formats "->do\nx\nend" formats "->do\nx\nend" formats ":foo" formats ":foo" formats "-> :: Foo . foo" formats "-> :: Foo . foo" formats "foo(out x)" formats "foo(out x)" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "def foo(@[AnnOne] @[AnnTwo] v); end" formats "def foo(@[AnnOne] @[AnnTwo] &block : Int32 -> ); end" formats "def foo(@[AnnOne] @[AnnTwo] &block : Int32 -> ); end" formats "10 / a" formats "10 / a" formats "module Foo\n 1 # bar\nend\n\nmodule Foo\n 1\n # bar\nend\n\nmodule Foo\n 1\n\n # bar\nend\n\nmodule Foo\n 1\n 2\n # bar\nend\n\nmodule Foo\n 1\n 2\n\n # bar\nend\n\nif 1\n 1\n # bar\nend\n\nif 1\n 1\n\n # bar\nend\n\n1\n2\n# foo\n\n1\n2\n\n# foo\n" formats "module Foo\n 1 # bar\nend\n\nmodule Foo\n 1\n # bar\nend\n\nmodule Foo\n 1\n\n # bar\nend\n\nmodule Foo\n 1\n 2\n # bar\nend\n\nmodule Foo\n 1\n 2\n\n # bar\nend\n\nif 1\n 1\n # bar\nend\n\nif 1\n 1\n\n # bar\nend\n\n1\n2\n# foo\n\n1\n2\n\n# foo\n" formats "class Foo\n enum Bar\n A; B; C;\n D; E; F\nend\nend\n" formats "class Foo\n enum Bar\n A; B; C;\n D; E; F\nend\nend\n" formats "def foo(x @y)\nend" formats "def foo(x @y)\nend" formats "loop do\n 1\n loop do\n 2\n rescue\n 3\n end\n 4\nend" formats "loop do\n 1\n loop do\n 2\n rescue\n 3\n end\n 4\nend" formats "# Hello\n#\n# ```cr\n# 1\n# ```\n# Bye" formats "# Hello\n#\n# ```cr\n# 1\n# ```\n# Bye" formats "foo &.bar.nil?" formats "foo &.bar.nil?" formats "-> : Int32[1] {}" formats "-> : Int32[1] {}" formats "foo self // 1" formats "foo self // 1" formats "-> : Array(Int32) {}" formats "-> : Array(Int32) {}" formats "[1, 2, 3] of Foo" formats "[1, 2, 3] of Foo" formats "begin\n select\n when foo\n # foo\n # bar\n else\n # foo\n # bar\n end\nend" formats "begin\n select\n when foo\n # foo\n # bar\n else\n # foo\n # bar\n end\nend" formats "case 1\nwhen 2\n 3\n # foo\nelse\n 4\n # bar\nend" formats "case 1\nwhen 2\n 3\n # foo\nelse\n 4\n # bar\nend" formats "foo.bar(&.baz)" formats "foo.bar(&.baz)" formats "def foo ( x , y , ) \n end" formats "def foo ( x , y , ) \n end" formats "macro foo(x, *, z)\nend" formats "macro foo(x, *, z)\nend" formats "asm(\n\"nop\"\n)" formats "asm(\n\"nop\"\n)" formats "a(&.b.c.as(C))" formats "a(&.b.c.as(C))" formats "1.[]=(2) { 3 }" formats "1.[]=(2) { 3 }" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "case 1\nwhen 2\n\n#comment\nend" formats "case 1\nwhen 2\n\n#comment\nend" formats "yield *1" formats "yield *1" formats "->@foo.foo" formats "->@foo.foo" formats "foo 1 , &bar" formats "foo 1 , &bar" formats "extend Foo" formats "extend Foo" formats "\"\#{foo = 1\n}\"" formats "\"\#{foo = 1\n}\"" formats "x[ y ] += 1" formats "x[ y ] += 1" formats "enum Baz\nA = 1\nFOO = 2\n\nEX = 3\nend" formats "enum Baz\nA = 1\nFOO = 2\n\nEX = 3\nend" formats "::Tuple()" formats "::Tuple()" formats "/\#{1}/imx" formats "/\#{1}/imx" formats "asm(\"a\" : \"b\"(c) : \"d\"(e) :: \"volatile\")" formats "asm(\"a\" : \"b\"(c) : \"d\"(e) :: \"volatile\")" formats "foo x: 1, y: 2" formats "foo x: 1, y: 2" formats "{1, 2, 3}" formats "{1, 2, 3}" formats "if 1\n foo(\n 1,\n 2 # lala\n )\nend\n" formats "if 1\n foo(\n 1,\n 2 # lala\n )\nend\n" formats "foo(\n 1, 2,\n&block)" formats "foo(\n 1, 2,\n&block)" formats "if 1 &&\n (2 || 3)\n 1\nelse\n 2\nend" formats "if 1 &&\n (2 || 3)\n 1\nelse\n 2\nend" formats "\n# hello\n1" formats "\n# hello\n1" formats "foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n})" formats "foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n})" formats "::foo(1, 2)" formats "::foo(1, 2)" Unicode bi-directional control characters formats "%Q(\u2068)" formats "%Q(\u2068)" formats "%i(\u202E)" formats "%i(\u202E)" formats "{\"\u2066\": 1}" formats "{\"\u2066\": 1}" formats "NamedTuple(\"\u202C\": Int32)" formats "NamedTuple(\"\u202C\": Int32)" formats "%r(\u2068)" formats "%r(\u2068)" formats "%r(\u202D)" formats "%r(\u202D)" formats "<<-EOS\n\u2067\#{1}\nEOS" formats "<<-EOS\n\u2067\#{1}\nEOS" formats "\"\\c\u2066\"" formats "\"\\c\u2066\"" formats "%w(\u2069)" formats "%w(\u2069)" formats "\"\u202C\"" formats "\"\u202C\"" formats "<<-EOS\n\u2069\#{1}\nEOS" formats "<<-EOS\n\u2069\#{1}\nEOS" formats "def foo(\"\u202B\" x)\nend" formats "def foo(\"\u202B\" x)\nend" formats "<<-EOS\n\u202A\nEOS" formats "<<-EOS\n\u202A\nEOS" formats "\"\\c\u202B\"" formats "\"\\c\u202B\"" formats "%(\u202E)" formats "%(\u202E)" formats "<<-EOS\n\u2068\nEOS" formats "<<-EOS\n\u2068\nEOS" formats "%r(\u202A)" formats "%r(\u202A)" formats "%i(\u202A)" formats "%i(\u202A)" formats "%w(\u202C)" formats "%w(\u202C)" formats "foo(\"\u202B\": 1)" formats "foo(\"\u202B\": 1)" formats "%i(\u202D)" formats "%i(\u202D)" formats "/\u202A/" formats "/\u202A/" formats "%r(\u2069\#{1})" formats "%r(\u2069\#{1})" formats "%(\u2067)" formats "%(\u2067)" formats "%r(\u202E)" formats "%r(\u202E)" formats "def foo(\"\u202C\" x)\nend" formats "def foo(\"\u202C\" x)\nend" formats "%Q(\u202D\#{1})" formats "%Q(\u202D\#{1})" formats "\"\u2067\"" formats "\"\u2067\"" formats "%Q(\u2068\#{1})" formats "%Q(\u2068\#{1})" formats "\"\\c\u2067\#{1}\"" formats "\"\\c\u2067\#{1}\"" formats "%i(\u2069)" formats "%i(\u2069)" formats "%(\u202B)" formats "%(\u202B)" formats "\"\\c\u202C\"" formats "\"\\c\u202C\"" formats "%(\u202A)" formats "%(\u202A)" formats "/\u2066\#{1}/" formats "/\u2066\#{1}/" formats "<<-EOS\n\u202E\#{1}\nEOS" formats "<<-EOS\n\u202E\#{1}\nEOS" formats "%Q(\u2066)" formats "%Q(\u2066)" formats "\"\u202D\"" formats "\"\u202D\"" formats "\"\u2066\#{1}\"" formats "\"\u2066\#{1}\"" formats "<<-EOS\n\u202B\nEOS" formats "<<-EOS\n\u202B\nEOS" formats "\"\\c\u202A\#{1}\"" formats "\"\\c\u202A\#{1}\"" formats "\"\\c\u202E\#{1}\"" formats "\"\\c\u202E\#{1}\"" formats "%i(\u202C)" formats "%i(\u202C)" formats "/\u2066/" formats "/\u2066/" formats "%Q(\u2069\#{1})" formats "%Q(\u2069\#{1})" formats "/\u2069\#{1}/" formats "/\u2069\#{1}/" formats "%i(\u2068)" formats "%i(\u2068)" formats "%(\u202C)" formats "%(\u202C)" formats "\"\\c\u202C\#{1}\"" formats "\"\\c\u202C\#{1}\"" formats "foo(\"\u202D\": 1)" formats "foo(\"\u202D\": 1)" formats "/\u2067/" formats "/\u2067/" formats "<<-EOS\n\u202C\#{1}\nEOS" formats "<<-EOS\n\u202C\#{1}\nEOS" formats "%Q(\u2066\#{1})" formats "%Q(\u2066\#{1})" formats "%r(\u202B)" formats "%r(\u202B)" formats "<<-EOS\n\u202D\nEOS" formats "<<-EOS\n\u202D\nEOS" formats "%r(\u202E\#{1})" formats "%r(\u202E\#{1})" formats "{\"\u2068\": 1}" formats "{\"\u2068\": 1}" formats "%q(\u2068)" formats "%q(\u2068)" formats "%(\u2066)" formats "%(\u2066)" formats "<<-'EOS'\n\u2067\nEOS" formats "<<-'EOS'\n\u2067\nEOS" formats "\"\u202A\#{1}\"" formats "\"\u202A\#{1}\"" formats "%w(\u202A)" formats "%w(\u202A)" formats "\"\\c\u2066\#{1}\"" formats "\"\\c\u2066\#{1}\"" formats "NamedTuple(\"\u202A\": Int32)" formats "NamedTuple(\"\u202A\": Int32)" formats "%r(\u2068\#{1})" formats "%r(\u2068\#{1})" formats "\"\\c\u2069\"" formats "\"\\c\u2069\"" formats "/\u202D\#{1}/" formats "/\u202D\#{1}/" formats "foo(\"\u2067\": 1)" formats "foo(\"\u2067\": 1)" formats "%q(\u2069)" formats "%q(\u2069)" formats "NamedTuple(\"\u2066\": Int32)" formats "NamedTuple(\"\u2066\": Int32)" formats "<<-'EOS'\n\u2066\nEOS" formats "<<-'EOS'\n\u2066\nEOS" formats "%w(\u2067)" formats "%w(\u2067)" formats "\"\\c\u202A\"" formats "\"\\c\u202A\"" formats "def foo(\"\u202E\" x)\nend" formats "def foo(\"\u202E\" x)\nend" formats "%q(\u202A)" formats "%q(\u202A)" formats "%q(\u202B)" formats "%q(\u202B)" formats "%Q(\u202B)" formats "%Q(\u202B)" formats "%Q(\u2067\#{1})" formats "%Q(\u2067\#{1})" formats "def foo(\"\u202A\" x)\nend" formats "def foo(\"\u202A\" x)\nend" formats "\"\u2066\"" formats "\"\u2066\"" formats "<<-'EOS'\n\u202A\nEOS" formats "<<-'EOS'\n\u202A\nEOS" formats "<<-'EOS'\n\u202C\nEOS" formats "<<-'EOS'\n\u202C\nEOS" formats "<<-EOS\n\u2066\#{1}\nEOS" formats "<<-EOS\n\u2066\#{1}\nEOS" formats "/\u202B\#{1}/" formats "/\u202B\#{1}/" formats "\"\\c\u202D\"" formats "\"\\c\u202D\"" formats "/\u2068/" formats "/\u2068/" formats "%(\u202D)" formats "%(\u202D)" formats "\"\u2069\"" formats "\"\u2069\"" formats "/\u202E/" formats "/\u202E/" formats "%r(\u202C)" formats "%r(\u202C)" formats "%w(\u202E)" formats "%w(\u202E)" formats "/\u2069/" formats "/\u2069/" formats "<<-EOS\n\u202E\nEOS" formats "<<-EOS\n\u202E\nEOS" formats "\"\u2069\#{1}\"" formats "\"\u2069\#{1}\"" formats "%q(\u202C)" formats "%q(\u202C)" formats "%r(\u202D\#{1})" formats "%r(\u202D\#{1})" formats "foo(\"\u2066\": 1)" formats "foo(\"\u2066\": 1)" formats "%Q(\u2069)" formats "%Q(\u2069)" formats "<<-EOS\n\u202D\#{1}\nEOS" formats "<<-EOS\n\u202D\#{1}\nEOS" formats "/\u202A\#{1}/" formats "/\u202A\#{1}/" formats "def foo(\"\u202D\" x)\nend" formats "def foo(\"\u202D\" x)\nend" formats "%r(\u202A\#{1})" formats "%r(\u202A\#{1})" formats "<<-EOS\n\u202C\nEOS" formats "<<-EOS\n\u202C\nEOS" formats "<<-'EOS'\n\u202B\nEOS" formats "<<-'EOS'\n\u202B\nEOS" formats "<<-EOS\n\u2066\nEOS" formats "<<-EOS\n\u2066\nEOS" formats "foo(\"\u202C\": 1)" formats "foo(\"\u202C\": 1)" formats "{\"\u202C\": 1}" formats "{\"\u202C\": 1}" formats "%i(\u2066)" formats "%i(\u2066)" formats "\"\u2068\"" formats "\"\u2068\"" formats "%Q(\u202C)" formats "%Q(\u202C)" formats "%(\u2068)" formats "%(\u2068)" formats "%(\u2069)" formats "%(\u2069)" formats "/\u202E\#{1}/" formats "/\u202E\#{1}/" formats "def foo(\"\u2069\" x)\nend" formats "def foo(\"\u2069\" x)\nend" formats "%w(\u202D)" formats "%w(\u202D)" formats "NamedTuple(\"\u202E\": Int32)" formats "NamedTuple(\"\u202E\": Int32)" formats "%q(\u202E)" formats "%q(\u202E)" formats "%Q(\u2067)" formats "%Q(\u2067)" formats "\"\u202B\#{1}\"" formats "\"\u202B\#{1}\"" formats "\"\u202E\#{1}\"" formats "\"\u202E\#{1}\"" formats "/\u202C\#{1}/" formats "/\u202C\#{1}/" formats "foo(\"\u2068\": 1)" formats "foo(\"\u2068\": 1)" formats "<<-EOS\n\u202B\#{1}\nEOS" formats "<<-EOS\n\u202B\#{1}\nEOS" formats "{\"\u202E\": 1}" formats "{\"\u202E\": 1}" formats "<<-EOS\n\u2069\nEOS" formats "<<-EOS\n\u2069\nEOS" formats "{\"\u202B\": 1}" formats "{\"\u202B\": 1}" formats "/\u2068\#{1}/" formats "/\u2068\#{1}/" formats "\"\\c\u2068\"" formats "\"\\c\u2068\"" formats "<<-'EOS'\n\u2069\nEOS" formats "<<-'EOS'\n\u2069\nEOS" formats "NamedTuple(\"\u2069\": Int32)" formats "NamedTuple(\"\u2069\": Int32)" formats "/\u202C/" formats "/\u202C/" formats "<<-'EOS'\n\u2068\nEOS" formats "<<-'EOS'\n\u2068\nEOS" formats "%Q(\u202D)" formats "%Q(\u202D)" formats "%q(\u202D)" formats "%q(\u202D)" formats "\"\u202C\#{1}\"" formats "\"\u202C\#{1}\"" formats "<<-EOS\n\u2067\nEOS" formats "<<-EOS\n\u2067\nEOS" formats "%w(\u2066)" formats "%w(\u2066)" formats "%Q(\u202E\#{1})" formats "%Q(\u202E\#{1})" formats "NamedTuple(\"\u202B\": Int32)" formats "NamedTuple(\"\u202B\": Int32)" formats "%w(\u2068)" formats "%w(\u2068)" formats "%q(\u2067)" formats "%q(\u2067)" formats "\"\\c\u202B\#{1}\"" formats "\"\\c\u202B\#{1}\"" formats "\"\u2068\#{1}\"" formats "\"\u2068\#{1}\"" formats "%r(\u2069)" formats "%r(\u2069)" formats "%Q(\u202A)" formats "%Q(\u202A)" formats "\"\u202D\#{1}\"" formats "\"\u202D\#{1}\"" formats "%r(\u2067)" formats "%r(\u2067)" formats "%r(\u202C\#{1})" formats "%r(\u202C\#{1})" formats "/\u2067\#{1}/" formats "/\u2067\#{1}/" formats "\"\\c\u2068\#{1}\"" formats "\"\\c\u2068\#{1}\"" formats "<<-EOS\n\u2068\#{1}\nEOS" formats "<<-EOS\n\u2068\#{1}\nEOS" formats "%i(\u202B)" formats "%i(\u202B)" formats "foo(\"\u202A\": 1)" formats "foo(\"\u202A\": 1)" formats "/\u202B/" formats "/\u202B/" formats "\"\u202E\"" formats "\"\u202E\"" formats "NamedTuple(\"\u202D\": Int32)" formats "NamedTuple(\"\u202D\": Int32)" formats "\"\u2067\#{1}\"" formats "\"\u2067\#{1}\"" formats "%Q(\u202C\#{1})" formats "%Q(\u202C\#{1})" formats "%q(\u2066)" formats "%q(\u2066)" formats "%i(\u2067)" formats "%i(\u2067)" formats "%w(\u202B)" formats "%w(\u202B)" formats "%r(\u2067\#{1})" formats "%r(\u2067\#{1})" formats "def foo(\"\u2068\" x)\nend" formats "def foo(\"\u2068\" x)\nend" formats "%r(\u2066\#{1})" formats "%r(\u2066\#{1})" formats "{\"\u202D\": 1}" formats "{\"\u202D\": 1}" formats "\"\u202B\"" formats "\"\u202B\"" formats "\"\\c\u2067\"" formats "\"\\c\u2067\"" formats "%Q(\u202E)" formats "%Q(\u202E)" formats "NamedTuple(\"\u2068\": Int32)" formats "NamedTuple(\"\u2068\": Int32)" formats "%r(\u202B\#{1})" formats "%r(\u202B\#{1})" formats "def foo(\"\u2066\" x)\nend" formats "def foo(\"\u2066\" x)\nend" formats "\"\\c\u202E\"" formats "\"\\c\u202E\"" formats "/\u202D/" formats "/\u202D/" formats "{\"\u2067\": 1}" formats "{\"\u2067\": 1}" formats "{\"\u2069\": 1}" formats "{\"\u2069\": 1}" formats "%Q(\u202A\#{1})" formats "%Q(\u202A\#{1})" formats "%r(\u2066)" formats "%r(\u2066)" formats "def foo(\"\u2067\" x)\nend" formats "def foo(\"\u2067\" x)\nend" formats "%Q(\u202B\#{1})" formats "%Q(\u202B\#{1})" formats "NamedTuple(\"\u2067\": Int32)" formats "NamedTuple(\"\u2067\": Int32)" formats "foo(\"\u2069\": 1)" formats "foo(\"\u2069\": 1)" formats "{\"\u202A\": 1}" formats "{\"\u202A\": 1}" formats "\"\u202A\"" formats "\"\u202A\"" formats "<<-'EOS'\n\u202E\nEOS" formats "<<-'EOS'\n\u202E\nEOS" formats "\"\\c\u2069\#{1}\"" formats "\"\\c\u2069\#{1}\"" formats "<<-'EOS'\n\u202D\nEOS" formats "<<-'EOS'\n\u202D\nEOS" formats "foo(\"\u202E\": 1)" formats "foo(\"\u202E\": 1)" formats "\"\\c\u202D\#{1}\"" formats "\"\\c\u202D\#{1}\"" formats "<<-EOS\n\u202A\#{1}\nEOS" formats "<<-EOS\n\u202A\#{1}\nEOS" formats "lib Foo\n fun foo = \"bar\"(Int32) : Int32\nend" formats "lib Foo\n fun foo = \"bar\"(Int32) : Int32\nend" formats "{% verbatim do %}{{1}} + {{2}}{% end %}" formats "{% verbatim do %}{{1}} + {{2}}{% end %}" formats "foo { | a, ( b , (c, d) ) | a + b + c }" formats "foo { | a, ( b , (c, d) ) | a + b + c }" formats "asm(\"a\" :::: \"volatile\"\n)" formats "asm(\"a\" :::: \"volatile\"\n)" formats "foo do\n {1 => foo <<-X\n bar\n X\n }\nend" formats "foo do\n {1 => foo <<-X\n bar\n X\n }\nend" formats " 1" formats " 1" formats "foo(\n1,\n\n 2 \n)" formats "foo(\n1,\n\n 2 \n)" formats "->{ x }" formats "->{ x }" formats "case\nend" formats "case\nend" formats "enum E\n A # hello\n B # hello; C # hello\nend" formats "enum E\n A # hello\n B # hello; C # hello\nend" formats "begin\n 1 \\\n + 2\n 3\nend" formats "begin\n 1 \\\n + 2\n 3\nend" formats "lib Bar\n enum Foo\n A = 1\n end\nend" formats "lib Bar\n enum Foo\n A = 1\n end\nend" formats "foo.bar(&.%(baz))" formats "foo.bar(&.%(baz))" formats "->@@foo.foo?" formats "->@@foo.foo?" formats "return 1\n# end" formats "return 1\n# end" formats "macro foo\n if 1\n 1 + 2\n end\nend" formats "macro foo\n if 1\n 1 + 2\n end\nend" formats "$0.bar" formats "$0.bar" formats "\"hello\"" formats "\"hello\"" formats "case 1 # foo\nwhen 2\nend" formats "case 1 # foo\nwhen 2\nend" formats "foo.as? ( Int32* )" formats "foo.as? ( Int32* )" formats "run(\"a\", 1)" formats "run(\"a\", 1)" formats "1.as Int32" formats "1.as Int32" formats "a &.b.as C" formats "a &.b.as C" formats "10//a" formats "10//a" formats "long_variable_name = [\n {\n :foo => 1,\n }, {\n :bar => 2,\n },\n]" formats "long_variable_name = [\n {\n :foo => 1,\n }, {\n :bar => 2,\n },\n]" formats "module M\n @[MyAnn(\n 1\n\n )]\nend" formats "module M\n @[MyAnn(\n 1\n\n )]\nend" formats "return( 1 )" formats "return( 1 )" formats "def foo\n1\n2\n# foo\nend" formats "def foo\n1\n2\n# foo\nend" formats "def foo(@[MyAnn] & : String -> Nil); end" formats "def foo(@[MyAnn] & : String -> Nil); end" formats "(())" formats "(())" formats "{ {% for x in 1..2 %}3{% end %}, nil }" formats "{ {% for x in 1..2 %}3{% end %}, nil }" formats "{ 1 => 2 ,\n\n 3 => 4 }" formats "{ 1 => 2 ,\n\n 3 => 4 }" formats "def foo\n1\nensure\n2\nend" formats "def foo\n1\nensure\n2\nend" formats "foo \\\n 1,\n 2\n\nbar \\\n foo: 1,\n bar: 2" formats "foo \\\n 1,\n 2\n\nbar \\\n foo: 1,\n bar: 2" formats "foo : (F(A)) | D" formats "foo : (F(A)) | D" formats "return 1 , 2" formats "return 1 , 2" formats "bla.select(&.all?{ |x| x } )" formats "bla.select(&.all?{ |x| x } )" formats "while 1 &&\n2 &&\n3\n4\nend" formats "while 1 &&\n2 &&\n3\n4\nend" formats "begin\n1\nrescue ex : Int32 | Float64 \n3\nend" formats "begin\n1\nrescue ex : Int32 | Float64 \n3\nend" formats "foo &.[]?( 1, 2 )" formats "foo &.[]?( 1, 2 )" formats "loop do\n 1\nrescue\n 2\nend" formats "loop do\n 1\nrescue\n 2\nend" formats "1.!=() { 3 }" formats "1.!=() { 3 }" formats "nil?" formats "nil?" formats " <<-EOF\n 1\nEOF" formats " <<-EOF\n 1\nEOF" formats "a = \"\n\"\n1 # 1\n12 # 2\n" formats "a = \"\n\"\n1 # 1\n12 # 2\n" formats "->{\n # first comment\n puts \"hi\"\n # second comment\n}" formats "->{\n # first comment\n puts \"hi\"\n # second comment\n}" formats "%w{one( two( three)}" formats "%w{one( two( three)}" formats "bar = foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n })" formats "bar = foo({\n 1 => 2,\n 3 => 4,\n 5 => 6,\n })" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n @[MyAnn]\n biz\n); end" formats "def run\n\nrescue\n 2\n 3\nend" formats "def run\n\nrescue\n 2\n 3\nend" formats "unless a\n2; 3\nelse\n3\nend" formats "unless a\n2; 3\nelse\n3\nend" formats "1 + \\\n2\n3" formats "1 + \\\n2\n3" formats "case 1 \n when 2 , 3 \n 4 \n end" formats "case 1 \n when 2 , 3 \n 4 \n end" formats "NamedTuple(a: Int32,)" formats "NamedTuple(a: Int32,)" formats "foo[&.bar]?" formats "foo[&.bar]?" formats "def foo\n 1\n 2\nrescue IO\n 1\nend" formats "def foo\n 1\n 2\nrescue IO\n 1\nend" formats "{ {1, 2, 3} => 4 }" formats "{ {1, 2, 3} => 4 }" formats "Foo(\"bar\": Int32, \"baz qux\": Float64)" formats "Foo(\"bar\": Int32, \"baz qux\": Float64)" formats "a = foo(bar(baz3 do\nend))" formats "a = foo(bar(baz3 do\nend))" formats " <<-HTML\n foo\n HTML" formats " <<-HTML\n foo\n HTML" formats "lib Foo\n fun foo =\n bar : Void\nend" formats "lib Foo\n fun foo =\n bar : Void\nend" formats "if a\nif b\nelse\n4\nend\nend" formats "if a\nif b\nelse\n4\nend\nend" formats "x, y, z = <<-FOO, <<-BAR, <<-BAZ\n hello\n FOO\n world\n BAR\n qux\nBAZ" formats "x, y, z = <<-FOO, <<-BAR, <<-BAZ\n hello\n FOO\n world\n BAR\n qux\nBAZ" formats "alias A = ({A, (B)})" formats "alias A = ({A, (B)})" formats "a = / /" formats "a = / /" formats "while 1 # foo\n # bar\n 2\nend" formats "while 1 # foo\n # bar\n 2\nend" formats "def foo : (A, B) ->\n nil\nend" formats "def foo : (A, B) ->\n nil\nend" formats "def execute\n begin\n 1\n ensure\n 2\n end\n 3\nend" formats "def execute\n begin\n 1\n ensure\n 2\n end\n 3\nend" formats "foo &.bar.as(T)" formats "foo &.bar.as(T)" formats "foo = 1\n->foo.foo" formats "foo = 1\n->foo.foo" formats "Foo( Bar( ) )" formats "Foo( Bar( ) )" formats "1 + \n2" formats "1 + \n2" formats "1.>= { 3 }" formats "1.>= { 3 }" formats "def foo(x @@y)\nend" formats "def foo(x @@y)\nend" formats "1 + \\\n2 + \\\n3" formats "1 + \\\n2 + \\\n3" formats "a &.!" formats "a &.!" formats "break( 1 , 2 )" formats "break( 1 , 2 )" formats "begin\n # Comment\n\n\nend" formats "begin\n # Comment\n\n\nend" formats "def foo(x y)\nend" formats "def foo(x y)\nend" formats "foo (1)" formats "foo (1)" formats "def foo(x : X) forall X , Y; end" formats "def foo(x : X) forall X , Y; end" formats "foo &bar" formats "foo &bar" formats "foo(\"b\#{1}\" \\\n\"baz\")" formats "foo(\"b\#{1}\" \\\n\"baz\")" formats "1 # foo\n/ 1 /" formats "1 # foo\n/ 1 /" formats "def foo\n case x\n # z\n when 1\n end\nend" formats "def foo\n case x\n # z\n when 1\n end\nend" formats "a[1] , b[2] = 1 , 2" formats "a[1] , b[2] = 1 , 2" formats "if 1\n foo(\n bar,\n # comment\n )\nend" formats "if 1\n foo(\n bar,\n # comment\n )\nend" formats "foo([\n 1,\n 2,\n 3,\n])" formats "foo([\n 1,\n 2,\n 3,\n])" formats "case 1 \n when 2 \n 3 \n else 4 \n end" formats "case 1 \n when 2 \n 3 \n else 4 \n end" formats "x : Int32 |\nString" formats "x : Int32 |\nString" formats "unless a\n2\nelse\nend" formats "unless a\n2\nelse\nend" formats "foo &.as(T).bar" formats "foo &.as(T).bar" formats "{\n \"foo\": 1,\n \"babraz\": 2,\n}" formats "{\n \"foo\": 1,\n \"babraz\": 2,\n}" formats "if a\n2\nelse\n3\nend" formats "if a\n2\nelse\n3\nend" formats "x = uninitialized Int32" formats "x = uninitialized Int32" formats "1 # foo\n/ 1 /" formats "1 # foo\n/ 1 /" formats "def foo( & block )\nend" formats "def foo( & block )\nend" formats "1 &+ 2" formats "1 &+ 2" formats "-> : {x: Int32, y: String} {}" formats "-> : {x: Int32, y: String} {}" formats "lib Foo\nfun foo () : Int32\nend" formats "lib Foo\nfun foo () : Int32\nend" formats "->foo!" formats "->foo!" formats "foo({% verbatim do %}{{1}} + {{2}}{% end %})" formats "foo({% verbatim do %}{{1}} + {{2}}{% end %})" formats "<<-FOO\nfoo\n1\nFOO" formats "<<-FOO\nfoo\n1\nFOO" formats "\"hel\\nlo\"" formats "\"hel\\nlo\"" formats ":-" formats ":-" formats "foo({\nbar: 1,\n})" formats "foo({\nbar: 1,\n})" formats ":&" formats ":&" formats "%(hello)" formats "%(hello)" formats "0u64" formats "0u64" formats "def foo(x, **z, &block)\nend" formats "def foo(x, **z, &block)\nend" formats "-> :: Foo . foo=" formats "-> :: Foo . foo=" formats "def foo(\n foo,\n\n @[MyAnn]\n &block\n); end" formats "def foo(\n foo,\n\n @[MyAnn]\n &block\n); end" formats "x : Int32 = 1" formats "x : Int32 = 1" formats "break" formats "break" formats "[/ /, / /]" formats "[/ /, / /]" formats "next *1 , *2" formats "next *1 , *2" formats "a = %w(\n one two\n three four\n)" formats "a = %w(\n one two\n three four\n)" formats "def foo(**a,)\n 1\nend" formats "def foo(**a,)\n 1\nend" formats "foo : (A -> B)\nbar : C" formats "foo : (A -> B)\nbar : C" formats "def foo ( x ,\n y ) \n end" formats "def foo ( x ,\n y ) \n end" formats "1 \\\nensure 2" formats "1 \\\nensure 2" formats "def foo(x)\n {% if true %}\n x = x + 2\n {% end %}\nend" formats "def foo(x)\n {% if true %}\n x = x + 2\n {% end %}\nend" formats "@[Foo(\n 1,\n)]" formats "@[Foo(\n 1,\n)]" formats "sizeof( Int32 )" formats "sizeof( Int32 )" formats ":|" formats ":|" formats "def foo( x , & block : ->)\nend" formats "def foo( x , & block : ->)\nend" formats ":&*" formats ":&*" formats "return { {1, 2}, {3, 4} }" formats "return { {1, 2}, {3, 4} }" formats "break( *1 , *2 )" formats "break( *1 , *2 )" formats "if 1 # foo\n2\nend" formats "if 1 # foo\n2\nend" formats "def foo(\nx, #foo\nz #bar\n)\nend" formats "def foo(\nx, #foo\nz #bar\n)\nend" does not add `&` without flag `method_signature_yield` formats "def foo(x,\n)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo\n yield\nend" formats "def foo\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo()\n yield\nend" formats "def foo()\n yield\nend" formats "def foo(x)\n yield\nend" formats "def foo(x)\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo(x,\n y)\n yield\nend" formats "def foo(x,\n y)\n yield\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "1.[]= { 3 }" formats "1.[]= { 3 }" formats "foo &.responds_to?(:foo)" formats "foo &.responds_to?(:foo)" formats "a = 1\n;\nb = 2" formats "a = 1\n;\nb = 2" formats "case 1 \n when .foo? \n 3 \n end" formats "case 1 \n when .foo? \n 3 \n end" formats "1 \\\n+ 2" formats "1 \\\n+ 2" formats "$~ = 1" formats "$~ = 1" formats "%w(one two three)" formats "%w(one two three)" formats " {{\n1 + 2 }}" formats " {{\n1 + 2 }}" formats "return" formats "return" formats "1 \\\nrescue 2" formats "1 \\\nrescue 2" formats "def foo: Int32\nend" formats "def foo: Int32\nend" formats "{1 => 2, 3 => 4}\n{5234234 => 234098234, 7 => 8}" formats "{1 => 2, 3 => 4}\n{5234234 => 234098234, 7 => 8}" formats "fun foo(x : Int32) : Int32\n 1\nend" formats "fun foo(x : Int32) : Int32\n 1\nend" formats "long_variable_name = [\n {\n :foo => 1,\n },\n {\n :bar => 2,\n },\n]" formats "long_variable_name = [\n {\n :foo => 1,\n },\n {\n :bar => 2,\n },\n]" formats "foo.[ 1, 2 ]?" formats "foo.[ 1, 2 ]?" formats ":*" formats ":*" formats "def /(x)\n 1\nend" formats "def /(x)\n 1\nend" formats "foo(baz1 do\nend)" formats "foo(baz1 do\nend)" formats "-> :: foo=" formats "-> :: foo=" formats "case 1\nwhen \"foo\" ; 3\nwhen \"lalalala\"; 4\nelse 5\nend" formats "case 1\nwhen \"foo\" ; 3\nwhen \"lalalala\"; 4\nelse 5\nend" formats "alias Foo = Bar" formats "alias Foo = Bar" formats "->foo?" formats "->foo?" formats ":+" formats ":+" formats "unless a\nelse\n2\nend" formats "unless a\nelse\n2\nend" formats "1\n.." formats "1\n.." formats "foo 1" formats "foo 1" formats "0x1234_u32" formats "0x1234_u32" formats "self.as(Int32)" formats "self.as(Int32)" formats "foo[x: 1, &.bar]?" formats "foo[x: 1, &.bar]?" formats "foo(->{\n 1 + 2\n})" formats "foo(->{\n 1 + 2\n})" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] baz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n @[MyAnn] baz\n); end" formats "[ * [ * [ 1 ] ], * \n[ 2] ]" formats "[ * [ * [ 1 ] ], * \n[ 2] ]" formats "def foo\n1\nrescue\n2\nend" formats "def foo\n1\nrescue\n2\nend" formats "foo(&.bar)" formats "foo(&.bar)" formats "begin 0[1] rescue 2 end" formats "begin 0[1] rescue 2 end" formats "- 1" formats "- 1" formats "x : Int32**" formats "x : Int32**" formats "class Foo\n # ```\n # 1\n # ```\nend\n" formats "class Foo\n # ```\n # 1\n # ```\nend\n" formats "long_variable_name = [1, 2, 3,\n 4, 5, 6]" formats "long_variable_name = [1, 2, 3,\n 4, 5, 6]" formats "class Foo;end" formats "class Foo;end" formats "foo.bar = \n1" formats "foo.bar = \n1" formats " macro foo\n end\n\n :+" formats " macro foo\n end\n\n :+" formats "select\n# when foo\nwhen bar\n break\nend" formats "select\n# when foo\nwhen bar\n break\nend" formats "enum Baz\nA = 1\nFOO\n\nEX = 3\nend" formats "enum Baz\nA = 1\nFOO\n\nEX = 3\nend" formats "def foo ( x , y ) \n end" formats "def foo ( x , y ) \n end" formats "foo(\n 1, 2, &block)" formats "foo(\n 1, 2, &block)" formats "-> : Int32* {}" formats "-> : Int32* {}" formats "#!shebang\n1 + 2" formats "#!shebang\n1 + 2" formats "def foo ( @@x) \n end" formats "def foo ( @@x) \n end" formats "module Foo\n1\n\n# foo\nend" formats "module Foo\n1\n\n# foo\nend" formats "def foo(x) # bar\n # baz\nend" formats "def foo(x) # bar\n # baz\nend" formats "begin\n #hola\n 1\nend\n" formats "begin\n #hola\n 1\nend\n" formats "foo[bar.baz]\n .qux" formats "foo[bar.baz]\n .qux" formats "foo &.bar.is_a?(Baz)" formats "foo &.bar.is_a?(Baz)" formats "alias Foo=Bar" formats "alias Foo=Bar" formats "bar = foo(->{\n 1 + 2\n})" formats "bar = foo(->{\n 1 + 2\n})" formats "include Foo" formats "include Foo" formats "alignof( Int32 )" formats "alignof( Int32 )" formats "getter foo # comment\n\ndef foo\nend" formats "getter foo # comment\n\ndef foo\nend" formats "def foo\n ((((((((((((((((0_u64\n ) | ptr[0]) << 8\n ) | ptr[1]) << 8\n ) | ptr[2]) << 8\n ) | ptr[3]) << 8\n ) | ptr[4]) << 8\n ) | ptr[5]) << 8\n ) | ptr[6]) << 8\n ) | ptr[7])\nend" formats "def foo\n ((((((((((((((((0_u64\n ) | ptr[0]) << 8\n ) | ptr[1]) << 8\n ) | ptr[2]) << 8\n ) | ptr[3]) << 8\n ) | ptr[4]) << 8\n ) | ptr[5]) << 8\n ) | ptr[6]) << 8\n ) | ptr[7])\nend" formats "(1 .. )" formats "(1 .. )" formats "a = case 1\nwhen 2\n3\nend" formats "a = case 1\nwhen 2\n3\nend" formats "\"1\#{\"\#{\"2\"}\"}3\#{\"4\"}5\"" formats "\"1\#{\"\#{\"2\"}\"}3\#{\"4\"}5\"" formats "-> :: Foo . foo?" formats "-> :: Foo . foo?" formats "{ \"foo\": 1 }" formats "{ \"foo\": 1 }" formats "case / /\nwhen / /, /x/\n / /\nend" formats "case / /\nwhen / /, /x/\n / /\nend" formats "foo(\n <<-HERE,\n hello\n HERE\n foo: 1,\n)" formats "foo(\n <<-HERE,\n hello\n HERE\n foo: 1,\n)" formats "struct Foo \n\n 1 \n\nend" formats "struct Foo \n\n 1 \n\nend" formats "def foo\nend\n\n\n\ndef bar\nend" formats "def foo\nend\n\n\n\ndef bar\nend" formats "return 1" formats "return 1" formats "NamedTuple(\n a: Int32,\n)" formats "NamedTuple(\n a: Int32,\n)" formats "macro foo=(x)\nend" formats "macro foo=(x)\nend" formats "alias Foo=\nBar" formats "alias Foo=\nBar" formats "if 1\n ->{ 1 }\nend" formats "if 1\n ->{ 1 }\nend" formats "[] of Foo" formats "[] of Foo" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "<<-FOO\nFOO" formats "<<-FOO\nFOO" formats "foo\n .bar\n .baz(\n 1\n )" formats "foo\n .bar\n .baz(\n 1\n )" formats "__DIR__" formats "__DIR__" formats "1\n.as(Int32)" formats "1\n.as(Int32)" formats "1 ensure 2" formats "1 ensure 2" formats "1 rescue 2" formats "1 rescue 2" formats "@[ Foo ]\ndef foo\nend" formats "@[ Foo ]\ndef foo\nend" formats " * a = 1 " formats " * a = 1 " formats "def foo( x , & block )\nend" formats "def foo( x , & block )\nend" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\\v\\f\\e\"" formats "\"\\\\\\\"\\#\\a\\b\\n\\r\\t\\v\\f\\e\"" formats "def foo(x, **z)\nend" formats "def foo(x, **z)\nend" formats "foo { | a, ( _ , c ) | a + c }" formats "foo { | a, ( _ , c ) | a + c }" formats "def foo\n 1\n #\nrescue\nend" formats "def foo\n 1\n #\nrescue\nend" formats "x : {\"foo bar\": Int32}" formats "x : {\"foo bar\": Int32}" formats "foo { | ( a, *b , c ) | a }" formats "foo { | ( a, *b , c ) | a }" formats "1.===(2) { 3 }" formats "1.===(2) { 3 }" formats "macro flags\n {% if 1 %}{{1}}a{{2}}{% end %}\\\nend" formats "macro flags\n {% if 1 %}{{1}}a{{2}}{% end %}\\\nend" formats "1 if nil?\na.b + c" formats "1 if nil?\na.b + c" formats "asm(\"a\" : \"b\"(1), \"c\"(2) : \"d\"(3) : : \"volatile\")" formats "asm(\"a\" : \"b\"(1), \"c\"(2) : \"d\"(3) : : \"volatile\")" formats "->@@foo.foo!" formats "->@@foo.foo!" formats "foo.as(T).bar" formats "foo.as(T).bar" formats "foo(1, &.bar)" formats "foo(1, &.bar)" formats "break { {1, 2}, {3, 4} }, 5" formats "break { {1, 2}, {3, 4} }, 5" formats "alias X = ((Y, Z) ->)" formats "alias X = ((Y, Z) ->)" formats "1 * 2" formats "1 * 2" formats "def foo(a, **b, # comment\n &block)\nend" formats "def foo(a, **b, # comment\n &block)\nend" formats "break { 1 , 2 }" formats "break { 1 , 2 }" formats "def foo(x : self ?) \n end" formats "def foo(x : self ?) \n end" formats "macro foo\n {%1 + 2%}\\\nend" formats "macro foo\n {%1 + 2%}\\\nend" formats "# Hello\n#\n# ```\n# puts 1+2 # bye\n# 1+2 # hello\n#\n# 1+2\n# ```\n\n# ```\n# puts 1+2\n\n# ```\n# puts 1+2\n\n# Hola\n#\n# 1+2\n# foo do\n# 3+4\n# end\n\n# Hey\n#\n# 1+2\n# foo do\n# 3+4\n# end\n#\n# ```\n# 1+2\n# ```\n#\n# 1+2\n#\n# Bye\n" formats "# Hello\n#\n# ```\n# puts 1+2 # bye\n# 1+2 # hello\n#\n# 1+2\n# ```\n\n# ```\n# puts 1+2\n\n# ```\n# puts 1+2\n\n# Hola\n#\n# 1+2\n# foo do\n# 3+4\n# end\n\n# Hey\n#\n# 1+2\n# foo do\n# 3+4\n# end\n#\n# ```\n# 1+2\n# ```\n#\n# 1+2\n#\n# Bye\n" formats "foo\n \nbar" formats "foo\n \nbar" formats "asm(\"nop\" : \"a\"(0) )" formats "asm(\"nop\" : \"a\"(0) )" formats "foo : (self)?" formats "foo : (self)?" formats "def foo( & )\nend" formats "def foo( & )\nend" formats "pointerof( @a )" formats "pointerof( @a )" formats "1*2" formats "1*2" formats "{% if true %}\n # x\n #\n{% end %}\n\n# ```\n# x\n# ```" formats "{% if true %}\n # x\n #\n{% end %}\n\n# ```\n# x\n# ```" formats "1 // 2" formats "1 // 2" formats "return *1 ,2" formats "return *1 ,2" formats "next { 1 , 2 }" formats "next { 1 , 2 }" formats "begin\n begin\n a\n # b\n end\nend" formats "begin\n begin\n a\n # b\n end\nend" formats "->Foo.foo=" formats "->Foo.foo=" formats "foo &.nil?()" formats "foo &.nil?()" formats "\"foo \#{bar}\" \\\n \"baz\"" formats "\"foo \#{bar}\" \\\n \"baz\"" formats "1&+2&*3" formats "1&+2&*3" formats "bar = foo(->do\n 1 + 2\nend)" formats "bar = foo(->do\n 1 + 2\nend)" formats "foo(\n# x\n1,\n\n# y\nz: 2,\n\n# a\nb: 3)" formats "foo(\n# x\n1,\n\n# y\nz: 2,\n\n# a\nb: 3)" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "lib Foo\n fun foo = bar(Int32) : Int32\nend" formats "foo\n .foo1(bar\n .bar1\n .bar2)" formats "foo\n .foo1(bar\n .bar1\n .bar2)" formats "{1 => 2,\n 3 => 4, # lala\n}\n" formats "{1 => 2,\n 3 => 4, # lala\n}\n" formats "[\n1,\n\n2]" formats "[\n1,\n\n2]" formats "macro foo\n {% unless 1 %} 2 {% end %}\nend" formats "macro foo\n {% unless 1 %} 2 {% end %}\nend" formats "Set { 1 , 2 }" formats "Set { 1 , 2 }" formats "@x[ 1 ] += 2" formats "@x[ 1 ] += 2" formats "break *1" formats "break *1" formats "foo(A |\nB |\nC)" formats "foo(A |\nB |\nC)" formats "struct Foo\n # bar\n # baz\n1\nend" formats "struct Foo\n # bar\n # baz\n1\nend" formats "a = b = 1\na, b =\n b, a" formats "a = b = 1\na, b =\n b, a" formats "def foo(a, **b : Int32)\nend" formats "def foo(a, **b : Int32)\nend" formats "@[Foo()]" formats "@[Foo()]" formats "{ {foo: 2} }" formats "{ {foo: 2} }" formats "a = while 1\n2\nend" formats "a = while 1\n2\nend" formats "\"1\#{\"4\#{\"\#{\"2\"}\"}3\"}3\#{__DIR__}4\#{5}6\"" formats "\"1\#{\"4\#{\"\#{\"2\"}\"}3\"}3\#{__DIR__}4\#{5}6\"" formats "if 1\n foo(\n bar\n # comment\n )\nend" formats "if 1\n foo(\n bar\n # comment\n )\nend" formats "Union(Int32, String)?" formats "Union(Int32, String)?" formats "foo.[ 1 , 2 ] =3" formats "foo.[ 1 , 2 ] =3" formats "next { {1, 2}, {3, 4} }" formats "next { {1, 2}, {3, 4} }" formats "a &.!.!" formats "a &.!.!" formats "foo &.[]=( 1, 2 )" formats "foo &.[]=( 1, 2 )" formats "x : (A | B)" formats "x : (A | B)" formats "1 &&\n2 &&\n3" formats "1 &&\n2 &&\n3" formats "while 1\n2 # foo\nend" formats "while 1\n2 # foo\nend" formats "->(){}" formats "->(){}" formats "'\\n'" formats "'\\n'" formats "unless a\n2\nend" formats "unless a\n2\nend" formats "macro foo\n {{ 1 + 2 }}\\\nend" formats "macro foo\n {{ 1 + 2 }}\\\nend" formats "{1 => foo <<-X\nbar\nX\n}" formats "{1 => foo <<-X\nbar\nX\n}" formats " case 1\n when 2\n 3\n else #:newline, :eof\n 1 if 2\n return 3\n end\n" formats " case 1\n when 2\n 3\n else #:newline, :eof\n 1 if 2\n return 3\n end\n" formats "1\n2 \n # foo" formats "1\n2 \n # foo" formats "asm(\n # the assembly template string, following the\n # syntax for LLVM's integrated assembler\n \"nop\" : # output operands\n\"=r\"(foo), \"=r\"(bar) : # input operands\n\"r\"(1), \"r\"(baz) : # names of clobbered registers\n\"eax\", \"memory\" : # optional flags, corresponding to the LLVM IR\n # sideeffect / alignstack / inteldialect / unwind attributes\n\"volatile\", \"alignstack\", \"intel\", \"unwind\"\n)" formats "asm(\n # the assembly template string, following the\n # syntax for LLVM's integrated assembler\n \"nop\" : # output operands\n\"=r\"(foo), \"=r\"(bar) : # input operands\n\"r\"(1), \"r\"(baz) : # names of clobbered registers\n\"eax\", \"memory\" : # optional flags, corresponding to the LLVM IR\n # sideeffect / alignstack / inteldialect / unwind attributes\n\"volatile\", \"alignstack\", \"intel\", \"unwind\"\n)" formats "foo : Foo * * * * *" formats "foo : Foo * * * * *" formats "@[Foo::Bar]" formats "@[Foo::Bar]" formats ":\"foo bar\"" formats ":\"foo bar\"" formats "foo\n.bar\n.baz" formats "foo\n.bar\n.baz" formats "def foo ( x : Int32 = 1 ) \n end" formats "def foo ( x : Int32 = 1 ) \n end" formats "a = 1\na ||= begin\n 1\nend" formats "a = 1\na ||= begin\n 1\nend" formats "abstract def foo \n 1" formats "abstract def foo \n 1" formats "NamedTuple(\n a: Int32,)" formats "NamedTuple(\n a: Int32,)" formats "begin\n1\nrescue ex : Int32 \n3\nend" formats "begin\n1\nrescue ex : Int32 \n3\nend" formats "%" formats "%" formats "1.>=() { 3 }" formats "1.>=() { 3 }" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar\n); end" formats "[\n <<-EOF,\n foo\n EOF\n]" formats "[\n <<-EOF,\n foo\n EOF\n]" formats "def foo\n <<-FOO\n foo \#{1}\n FOO\nend" formats "def foo\n <<-FOO\n foo \#{1}\n FOO\nend" formats "0_u64" formats "0_u64" formats " {%\na = 1\n %}" formats " {%\na = 1\n %}" formats "foo &.[]?(1, 2)" formats "foo &.[]?(1, 2)" formats "1 +\n # foo\n 2" formats "1 +\n # foo\n 2" formats "return( *1 , *2 )" formats "return( *1 , *2 )" formats "1 || 2" formats "1 || 2" formats "<<-FOO\nbarfoo\nFOO" formats "<<-FOO\nbarfoo\nFOO" formats "String?" formats "String?" formats " {{\n1 + 2\n }}" formats " {{\n1 + 2\n }}" formats "ary.size = (1).to_i" formats "ary.size = (1).to_i" formats "1 #foo \n2 #bar" formats "1 #foo \n2 #bar" formats "lib Foo\nstruct Foo\nx , y , z : Int32\nend\nend" formats "lib Foo\nstruct Foo\nx , y , z : Int32\nend\nend" formats "if / /\nend" formats "if / /\nend" formats "macro foo\n {% for value, i in values %}\\\n {% if true %}\\\n {% end %}\\\n {{ 1 }}/\n {% end %}\\\nend\n\n{\n 1 => 2,\n 1234 => 5,\n}\n" formats "macro foo\n {% for value, i in values %}\\\n {% if true %}\\\n {% end %}\\\n {{ 1 }}/\n {% end %}\\\nend\n\n{\n 1 => 2,\n 1234 => 5,\n}\n" formats "class Foo < \n Bar \n\n 1 \n\nend" formats "class Foo < \n Bar \n\n 1 \n\nend" formats "{% if z %}\n class Foo\n end\n{% end %}" formats "{% if z %}\n class Foo\n end\n{% end %}" formats "module Foo\n# nothing\nend" formats "module Foo\n# nothing\nend" formats "foo &.[]?" formats "foo &.[]?" formats "[c.x]\n .foo" formats "[c.x]\n .foo" formats "foo.foo1(\n bar\n .bar1\n .bar2)" formats "foo.foo1(\n bar\n .bar1\n .bar2)" formats "foo ((1) ? 2 : 3)" formats "foo ((1) ? 2 : 3)" formats "macro foo\n {{ 1 + 2 }}\nend" formats "macro foo\n {{ 1 + 2 }}\nend" formats "foo.bar(1) # comment\n .baz" formats "foo.bar(1) # comment\n .baz" formats "[\n] of \n Foo " formats "[\n] of \n Foo " formats "%(\n1\n)\n\n{\n 1 => 2,\n 234 => 5,\n}" formats "%(\n1\n)\n\n{\n 1 => 2,\n 234 => 5,\n}" formats "nil" formats "nil" formats "def self . foo\nend" formats "def self . foo\nend" formats "if a\n2; 3\nelse\n3\nend" formats "if a\n2; 3\nelse\n3\nend" formats "if a\n2\n3\nelse\n4\n5\nend" formats "if a\n2\n3\nelse\n4\n5\nend" formats "case nil\nelse nil; nil # comment\nend" formats "case nil\nelse nil; nil # comment\nend" formats "Foo:: Bar" formats "Foo:: Bar" formats "(a).b { }\nc" formats "(a).b { }\nc" formats "foo.as? Int32*" formats "foo.as? Int32*" formats "unless a\nunless b\n3\nelse\n4\nend\nend" formats "unless a\nunless b\n3\nelse\n4\nend\nend" formats "$?" formats "$?" formats "\n # hello\n\n1" formats "\n # hello\n\n1" formats "10 ** a" formats "10 ** a" formats "def foo(\n foo,\n\n @[MyAnn]\n @[MyAnn]\n & : Nil -> Nil\n); end" formats "def foo(\n foo,\n\n @[MyAnn]\n @[MyAnn]\n & : Nil -> Nil\n); end" formats "if 1\n {% for x in y %} {% end %}\nend" formats "if 1\n {% for x in y %} {% end %}\nend" formats "select \n when foo ; 2 \n end" formats "select \n when foo ; 2 \n end" formats "@x ||= 1" formats "@x ||= 1" formats "1.!= do\nend" formats "1.!= do\nend" formats "module Foo;end" formats "module Foo;end" formats "a = foo(bar(\n 1,\n 2,\n))" formats "a = foo(bar(\n 1,\n 2,\n))" formats "foo(bar(\n 1,\n 2,\n))" formats "foo(bar(\n 1,\n 2,\n))" formats "foo.bar\n.baz" formats "foo.bar\n.baz" formats "x = {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}" formats "x = {% if flag?(:foo) %}\n foo + bar\n {% else %}\n baz + qux\n {% end %}" formats "alias Foo::Bar=Baz" formats "alias Foo::Bar=Baz" formats "module Moo \n\n 1 \n\nend" formats "module Moo \n\n 1 \n\nend" formats "x.try &.[] 123" formats "x.try &.[] 123" formats "1 # foo\n1234 # bar\n\n10 # bar" formats "1 # foo\n1234 # bar\n\n10 # bar" formats "class X; annotation FooAnnotation ; end ; end" formats "class X; annotation FooAnnotation ; end ; end" formats "foo bar # comment\n\n# doc\ndef baz; end" formats "foo bar # comment\n\n# doc\ndef baz; end" formats "{% for a in %w() %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "{% for a in %w() %}\n <<-FOO\n hello \n FOO\n{% end %}" formats "1 ?\n 2 : \n 3" formats "1 ?\n 2 : \n 3" formats "foo(1, 2,\n)" formats "foo(1, 2,\n)" formats "a[b] ||= c" formats "a[b] ||= c" formats "macro foo # bar\n baz\nend" formats "macro foo # bar\n baz\nend" formats "\n# hello\n\n\n1" formats "\n# hello\n\n\n1" formats "foo = {1, {2,\n 3},\n 4}" formats "foo = {1, {2,\n 3},\n 4}" formats "foo {;;1}" formats "foo {;;1}" formats "if 1\n {{1 + 2}}\nend" formats "if 1\n {{1 + 2}}\nend" formats "def foo(&block: Int32)\nend" formats "def foo(&block: Int32)\nend" formats "foo(\n a: 1,\n b: 2,\n )\n" formats "foo(\n a: 1,\n b: 2,\n )\n" formats "->Foo.foo!" formats "->Foo.foo!" formats "next 1 , 2" formats "next 1 , 2" formats "case 1 \n when 2 \n 3 \n end" formats "case 1 \n when 2 \n 3 \n end" formats "macro foo\n {% for x in y %} 2 {% end %}\nend" formats "macro foo\n {% for x in y %} 2 {% end %}\nend" formats "lib Foo\n fun foo =\n bar(Int32) : Int32\nend" formats "lib Foo\n fun foo =\n bar(Int32) : Int32\nend" formats "FOO = 2\nA = 1" formats "FOO = 2\nA = 1" formats "foo do | x , y | \n x \n end" formats "foo do | x , y | \n x \n end" gives proper line number in syntax error inside macro gives proper line number in syntax error inside macro formats "foo(\n 1,\n a: 1,\n b: 2,\n)" formats "foo(\n 1,\n a: 1,\n b: 2,\n)" formats "...\n2" formats "...\n2" formats "1 + 2" formats "1 + 2" formats "foo[a, b: 2]" formats "foo[a, b: 2]" formats "foo[&.bar] = 1" formats "foo[&.bar] = 1" formats "class X\n annotation FooAnnotation \n end \n end" formats "class X\n annotation FooAnnotation \n end \n end" formats "foo : (String -> Array(String)?) | (String -> Array(String)) | Nil" formats "foo : (String -> Array(String)?) | (String -> Array(String)) | Nil" formats "[\n 1, 2, # foo\n 3, 4,\n]" formats "[\n 1, 2, # foo\n 3, 4,\n]" formats "foo(\"bar\": 1, \"baz qux\": 2)" formats "foo(\"bar\": 1, \"baz qux\": 2)" formats "class Foo\n1\n\n# foo\nend" formats "class Foo\n1\n\n# foo\nend" formats "1.<=() { 3 }" formats "1.<=() { 3 }" formats "def foo(x : ( A | B )) : ( A | B )\nend" formats "def foo(x : ( A | B )) : ( A | B )\nend" formats "{ # foo\n 1 => 2,\n}" formats "{ # foo\n 1 => 2,\n}" formats "if 1\n2\nelsif\n3\n4\nelse\n6\nend" formats "if 1\n2\nelsif\n3\n4\nelse\n6\nend" formats "foo &.bar.responds_to?(:baz)" formats "foo &.bar.responds_to?(:baz)" formats "begin\n1\nrescue Int32 \n3\nend" formats "begin\n1\nrescue Int32 \n3\nend" formats "{\n a: 1,\n foo: bar,\n}" formats "{\n a: 1,\n foo: bar,\n}" formats "private getter foo" formats "private getter foo" formats "\"\#{\"\#{foo}\"}\"" formats "\"\#{\"\#{foo}\"}\"" formats "while / /\nend" formats "while / /\nend" formats "bar = foo([\n 1,\n 2,\n 3,\n])" formats "bar = foo([\n 1,\n 2,\n 3,\n])" formats "a = 1 if 1 == 2 ||\n 3 == 4\n" formats "a = 1 if 1 == 2 ||\n 3 == 4\n" formats "x.try &.[]= 123, 456" formats "x.try &.[]= 123, 456" formats "1 if 2\n# foo" formats "1 if 2\n# foo" formats "{ %w() }" formats "{ %w() }" formats "Foo( )" formats "Foo( )" formats "macro bar\n 1\nend\n\ncase 1\nwhen 2 then 3\nwhen 45 then 6\nend" formats "macro bar\n 1\nend\n\ncase 1\nwhen 2 then 3\nwhen 45 then 6\nend" formats "asm(\"nop\"\n: \"a\"(0) )" formats "asm(\"nop\"\n: \"a\"(0) )" formats "unless a\n2\nelse\n3\nend" formats "unless a\n2\nelse\n3\nend" formats "foo(bar(\n 1,\n baz(\n 2,\n 3,\n )\n))" formats "foo(bar(\n 1,\n baz(\n 2,\n 3,\n )\n))" formats " {% begin %} 2 {% end %}" formats " {% begin %} 2 {% end %}" formats "foo \"bar\": 1, \"baz qux\": 2" formats "foo \"bar\": 1, \"baz qux\": 2" formats "if 1;\n2; end" formats "if 1;\n2; end" formats "def foo : (A | B(C))\n nil\nend" formats "def foo : (A | B(C))\n nil\nend" formats "#### ###" formats "#### ###" formats "while 1\n# nothing\nend" formats "while 1\n# nothing\nend" formats "# foo\na = 1 # bar" formats "# foo\na = 1 # bar" formats "return *1" formats "return *1" formats "a || b" formats "a || b" formats "foo &.as(T)" formats "foo &.as(T)" formats "10**a" formats "10**a" formats "foo.[ 1 , 2 ]" formats "foo.[ 1 , 2 ]" formats "__FILE__" formats "__FILE__" formats "return 1, {2, 3}" formats "return 1, {2, 3}" formats "def foo\n@x = uninitialized Int32\nend" formats "def foo\n@x = uninitialized Int32\nend" formats "a = begin\n1\n2\nend" formats "a = begin\n1\n2\nend" formats "def foo(a : T, b : U) forall T, U\n #\nend" formats "def foo(a : T, b : U) forall T, U\n #\nend" formats "foo[x: 1, &.bar]" formats "foo[x: 1, &.bar]" formats "# Hello\n#\n# ```crystal\n# 1\n# ```\n# Bye" formats "# Hello\n#\n# ```crystal\n# 1\n# ```\n# Bye" formats "case / /\nwhen /x/, / /\n / /\nend" formats "case / /\nwhen /x/, / /\n / /\nend" formats "1 + # foo\n2" formats "1 + # foo\n2" formats "a = if 1\n2\nelse\n3\nend" formats "a = if 1\n2\nelse\n3\nend" formats "def foo(@x)\n\nrescue\nend" formats "def foo(@x)\n\nrescue\nend" formats "next( 1 )" formats "next( 1 )" formats "def foo ( x , y ,\n) \n end" formats "def foo ( x , y ,\n) \n end" formats "@[Foo(\n foo: 1,\n)]\ndef foo\nend" formats "@[Foo(\n foo: 1,\n)]\ndef foo\nend" formats "{x => self // 1}" formats "{x => self // 1}" formats "+ 1" formats "+ 1" formats "lib Foo\n {% if 1 %}\n fun foo\n {% end %}\nend\n\nmacro bar\n 1\nend" formats "lib Foo\n {% if 1 %}\n fun foo\n {% end %}\nend\n\nmacro bar\n 1\nend" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "foo . is_a? Bar" formats "foo . is_a? Bar" formats "foo.bar=(2)\n1" formats "foo.bar=(2)\n1" formats "macro flags\n {% if 1 %}\\\n {% end %}\\\nend" formats "macro flags\n {% if 1 %}\\\n {% end %}\\\nend" formats "{ {1}.foo, 2 }" formats "{ {1}.foo, 2 }" formats "foo.as?(T).bar" formats "foo.as?(T).bar" formats "foo(\n 1,\n 2\n) do\n 1\nend" formats "foo(\n 1,\n 2\n) do\n 1\nend" formats "lib Foo\nend" formats "lib Foo\nend" formats "foo(bar([\n 1,\n]))" formats "foo(bar([\n 1,\n]))" formats "call(foo <<-X\nbar\nX\n)" formats "call(foo <<-X\nbar\nX\n)" formats "{%\n unless true\n 1\n else\n 2\n end\n%}" formats "{%\n unless true\n 1\n else\n 2\n end\n%}" formats "case 1 \n when 2 ,\n 3 \n 4 \n end" formats "case 1 \n when 2 ,\n 3 \n 4 \n end" formats "+ a + d" formats "+ a + d" formats "foo([\n 1,\n bar do\n end,\n [\n 2,\n ],\n])" formats "foo([\n 1,\n bar do\n end,\n [\n 2,\n ],\n])" formats "lib Foo\ntype Foo = Bar\nend" formats "lib Foo\ntype Foo = Bar\nend" formats "Foo:: Bar" formats "Foo:: Bar" formats "foo bar:baz, qux:other" formats "foo bar:baz, qux:other" formats "def foo(**z : Foo)\nend" formats "def foo(**z : Foo)\nend" formats "x.is_a? T\n3\n" formats "x.is_a? T\n3\n" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n}" formats "Hash{\n foo => <<-EOF,\n foo\n EOF\n}" formats "{ \"foo\" => 1 }" formats "{ \"foo\" => 1 }" formats "lib Foo\nfun foo( ... ) : Int32\nend" formats "lib Foo\nfun foo( ... ) : Int32\nend" formats "foo.bar do\n baz\n .b\nend" formats "foo.bar do\n baz\n .b\nend" formats "instance_sizeof( Int32 )" formats "instance_sizeof( Int32 )" formats "x : (A -> B)?" formats "x : (A -> B)?" formats "# foo\ndef foo\nend\n# bar\ndef bar\nend" formats "# foo\ndef foo\nend\n# bar\ndef bar\nend" formats "foo(a: //, b: //)" formats "foo(a: //, b: //)" formats "_ = 1" formats "_ = 1" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2) )" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2) )" formats "foo . bar( x , y )" formats "foo . bar( x , y )" formats "foo do\n bar do\n foo <<-X\n bar\n X\n end\nend" formats "foo do\n bar do\n foo <<-X\n bar\n X\n end\nend" formats "foo 1,\na: 1,\nb: 2,\nc: 3" formats "foo 1,\na: 1,\nb: 2,\nc: 3" formats "def foo(x : (self)?)\nend" formats "def foo(x : (self)?)\nend" formats "Foo( * T, { * A ,*\n B } )" formats "Foo( * T, { * A ,*\n B } )" formats "->Foo.foo?" formats "->Foo.foo?" formats "::NamedTuple()" formats "::NamedTuple()" formats "foo(\n 1,\n # 2,\n 3,\n)" formats "foo(\n 1,\n # 2,\n 3,\n)" formats "<<-HTML\n \#{1}x\n y\n z\n HTML" formats "<<-HTML\n \#{1}x\n y\n z\n HTML" formats "select \n when foo \n 2 \n end" formats "select \n when foo \n 2 \n end" formats "macro foo\n 1 \n {{ \n 42 \n }} \n 2 \nend" formats "macro foo\n 1 \n {{ \n 42 \n }} \n 2 \nend" formats "case 1\nwhen 2 # a\n # b\nend" formats "case 1\nwhen 2 # a\n # b\nend" formats "foo : (A) | D" formats "foo : (A) | D" formats "def a\n b(\n a: 1, # x\n # y\n b: 2\n )\nend" formats "def a\n b(\n a: 1, # x\n # y\n b: 2\n )\nend" formats "asm(\"nop\" :: \"r\"(0))" formats "asm(\"nop\" :: \"r\"(0))" formats "@a" formats "@a" formats "$?.bar" formats "$?.bar" formats "Foo( x: Int32 )" formats "Foo( x: Int32 )" formats "def foo(x, *, z)\nend" formats "def foo(x, *, z)\nend" formats "->foo=" formats "->foo=" formats "foo 1, a: 1,\nb: 2,\nc: 3" formats "foo 1, a: 1,\nb: 2,\nc: 3" formats "case 1 \n when 2 \n 3 \n else \n 4 \n end" formats "case 1 \n when 2 \n 3 \n else \n 4 \n end" formats "$? = 1" formats "$? = 1" formats "lib Foo\n fun Foo = Bar\nend" formats "lib Foo\n fun Foo = Bar\nend" formats "class Foo\nx = 1\nend" formats "class Foo\nx = 1\nend" formats "1\n2\n# foo" formats "1\n2\n# foo" formats "-> :: foo!" formats "-> :: foo!" formats "foo(\n <<-HERE,\n hello\n HERE\n # foo\n foo: 1,\n)" formats "foo(\n <<-HERE,\n hello\n HERE\n # foo\n foo: 1,\n)" formats "foo { | a, ( b , c, ), | a + b + c }" formats "foo { | a, ( b , c, ), | a + b + c }" formats "->(x : Int32) { }" formats "->(x : Int32) { }" formats "if a\nif b\n3\nelse\n4\nend\nend" formats "if a\nif b\n3\nelse\n4\nend\nend" formats "<<-FOO\nbarfoobar\nFOO" formats "<<-FOO\nbarfoobar\nFOO" formats "case 1\nelse\n 2\nend" formats "case 1\nelse\n 2\nend" formats "foo = 1\n->foo.[]=(Int32)" formats "foo = 1\n->foo.[]=(Int32)" formats "::Pointer(T)" formats "::Pointer(T)" formats "x, y = <<-FOO, <<-BAR\n hello\n FOO\n world\n BAR" formats "x, y = <<-FOO, <<-BAR\n hello\n FOO\n world\n BAR" formats "lib Foo\nfun foo\nend" formats "lib Foo\nfun foo\nend" formats "foo.[1, 2] = 3" formats "foo.[1, 2] = 3" formats "next 1, {2, 3}" formats "next 1, {2, 3}" formats "next 1 , *2" formats "next 1 , *2" formats "alias A = (B) -> C" formats "alias A = (B) -> C" formats "1.as? Int32" formats "1.as? Int32" formats "{\n foo: 1,\n b: 2,\n barbaz: 3,\n}" formats "{\n foo: 1,\n b: 2,\n barbaz: 3,\n}" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1), \"c\"(2) )" formats "asm(\"nop\" : \"a\"(0)\n: \"b\"(1), \"c\"(2) )" formats "foo do;\n1; end" formats "foo do;\n1; end" formats "foo(bar(\n 1,\n baz(2,\n 3,\n )\n))" formats "foo(bar(\n 1,\n baz(2,\n 3,\n )\n))" formats "foo : StaticArray(Foo, 12)[34]" formats "foo : StaticArray(Foo, 12)[34]" formats "break 1" formats "break 1" formats "Foo::Bar(T, U?)?" formats "Foo::Bar(T, U?)?" formats "lib Foo::Bar\nend" formats "lib Foo::Bar\nend" formats "def foo(\"bar baz\" qux)\nend" formats "def foo(\"bar baz\" qux)\nend" formats "{\n <<-KEY => 1,\n key\n KEY\n}" formats "{\n <<-KEY => 1,\n key\n KEY\n}" formats "1.<= { 3 }" formats "1.<= { 3 }" formats "a = case 1\n when 1, # 1\n 2, # 2\n 3 # 3\n 1\n end" formats "a = case 1\n when 1, # 1\n 2, # 2\n 3 # 3\n 1\n end" formats "foo.bar.baz\n.qux" formats "foo.bar.baz\n.qux" adds `&` to yielding methods that don't have a block parameter (#8764) formats "def foo(\nx,\ny)\n yield\nend" formats "def foo(\nx,\ny)\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo(\n)\n yield\nend" formats "def foo()\n yield\nend" formats "def foo()\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x\n)\n yield\nend" formats "def foo(x,\ny)\n yield\nend" formats "def foo(x,\ny)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(a, **b)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo(x ,)\n yield\nend" formats "def foo\n yield\nend" formats "def foo\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(\nx,\n)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo(x,\n)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(x,\ny,)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "def foo(\nx, y)\n yield\nend" formats "macro f\n yield\n {{ yield }}\nend" formats "macro f\n yield\n {{ yield }}\nend" formats "def foo # bar\n yield\nend" formats "def foo # bar\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(\nx)\n yield\nend" formats "def foo(x)\n yield\nend" formats "def foo(x)\n yield\nend" formats "foo { |x, *y| }" formats "foo { |x, *y| }" formats "if 1\nfoo do | x , y | \n x \n end\nend" formats "if 1\nfoo do | x , y | \n x \n end\nend" formats "return *1 , *2" formats "return *1 , *2" formats "{% if flag?(:freebsd) %}\n 1 + 2\n{% end %}\n\ncase x\nwhen 1234 then 1\nelse x\nend" formats "{% if flag?(:freebsd) %}\n 1 + 2\n{% end %}\n\ncase x\nwhen 1234 then 1\nelse x\nend" formats "def foo(a,\n **b)\nend" formats "def foo(a,\n **b)\nend" formats "foo : ( A | B )" formats "foo : ( A | B )" formats "[] of (Array(T))" formats "[] of (Array(T))" formats "def foo(x)\n case //\n when //\n 3\n end\nend" formats "def foo(x)\n case //\n when //\n 3\n end\nend" formats "{\n1 => 2 ,\n 3 => 4 }" formats "{\n1 => 2 ,\n 3 => 4 }" formats "def foo(x, *, y, **z)\nend" formats "def foo(x, *, y, **z)\nend" formats "foo : self? | A" formats "foo : self? | A" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n foo => true,\n}" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n foo => true,\n}" formats "foo(a: //)" formats "foo(a: //)" formats "x : A?" formats "x : A?" formats "select\nwhen foo\n # foo\n # bar\nelse\n # foo\n # bar\nend" formats "select\nwhen foo\n # foo\n # bar\nelse\n # foo\n # bar\nend" formats "1..\n2" formats "1..\n2" formats "case nil\nelse nil; nil\n# comment\nend" formats "case nil\nelse nil; nil\n# comment\nend" formats "until 1\n2\nend" formats "until 1\n2\nend" formats "if 1;\n2;\nelse;\n3;\nend" formats "if 1;\n2;\nelse;\n3;\nend" formats "foo . bar = 1" formats "foo . bar = 1" formats "a &.b.c.as C" formats "a &.b.c.as C" formats "enum Foo\nend" formats "enum Foo\nend" formats "->{\nx\n}" formats "->{\nx\n}" formats "class Foo\n def foo\n # nothing\n end\nend" formats "class Foo\n def foo\n # nothing\n end\nend" formats "def foo(a, &@b)\nend" formats "def foo(a, &@b)\nend" formats "::NamedTuple(T)" formats "::NamedTuple(T)" formats "module Moo ( T )\nend" formats "module Moo ( T )\nend" formats "->@foo.foo=" formats "->@foo.foo=" formats "X(typeof(begin\n e.is_a?(Y) ? 1 : 2\nend))" formats "X(typeof(begin\n e.is_a?(Y) ? 1 : 2\nend))" formats "def foo(\n a,\n b,\n)\nend" formats "def foo(\n a,\n b,\n)\nend" formats "{ 1 => 2 , 3 => 4 }" formats "{ 1 => 2 , 3 => 4 }" formats "if 1 # foo\nend" formats "if 1 # foo\nend" formats "lib Foo\n fun foo =\n\n\n bar : Void\nend" formats "lib Foo\n fun foo =\n\n\n bar : Void\nend" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\")" formats "asm(\"a\" : \"b\"(c) : \"d\"(e)\n : \"f\")" formats "def foo(a, # comment\n *b)\nend" formats "def foo(a, # comment\n *b)\nend" formats "@[Foo( 1, 2 )]" formats "@[Foo( 1, 2 )]" formats "foo &.nil?" formats "foo &.nil?" formats "foo.bar. as? Int32" formats "foo.bar. as? Int32" formats "asm(\"nop\" :: )" formats "asm(\"nop\" :: )" formats "foo &.[]" formats "foo &.[]" formats "<<-HTML\n \#{\"foo\"}\n \#{\"bar\"}\n HTML" formats "<<-HTML\n \#{\"foo\"}\n \#{\"bar\"}\n HTML" formats "class Foo\ndef foo\n1\nensure\n2\nend\nend" formats "class Foo\ndef foo\n1\nensure\n2\nend\nend" formats "lib Foo\n fun Bar\nend" formats "lib Foo\n fun Bar\nend" formats "a = 1\ncase\nwhen 2\nelse\n a /= 3\nend" formats "a = 1\ncase\nwhen 2\nelse\n a /= 3\nend" formats "0i64" formats "0i64" formats "[1, 2, 3, ]" formats "[1, 2, 3, ]" formats "select \n when foo \n 2 \n when bar \n 3 \n end" formats "select \n when foo \n 2 \n when bar \n 3 \n end" formats "foo x: 1" formats "foo x: 1" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1) )" formats "asm(\"nop\" : \"a\"(0) : \"b\"(1) )" formats "module Foo; 1; end" formats "module Foo; 1; end" formats "alias Foo::Bar =Baz" formats "alias Foo::Bar =Baz" formats "{ * 1 * 2,\n*\n3, 4 }" formats "{ * 1 * 2,\n*\n3, 4 }" formats "{%\n if 1\n 2\n end\n%}" formats "{%\n if 1\n 2\n end\n%}" formats "&+ 1" formats "&+ 1" formats "1\n..\n2" formats "1\n..\n2" formats "1.!=(2) { 3 }" formats "1.!=(2) { 3 }" formats "macro foo(\n a,\n **b,\n)\nend" formats "macro foo(\n a,\n **b,\n)\nend" formats "asm(\"nop\" ::: \"eax\" )" formats "asm(\"nop\" ::: \"eax\" )" formats "1.=== do\nend" formats "1.=== do\nend" formats "if # some comment\n 2 # another\n 3 # final \n end # end " formats "if # some comment\n 2 # another\n 3 # final \n end # end " formats "def foo ( x : Foo.class ) \n end" formats "def foo ( x : Foo.class ) \n end" formats "class Foo\n macro foo\n 1 + 2 \n end\n end" formats "class Foo\n macro foo\n 1 + 2 \n end\n end" formats "begin\n 0[1] rescue 2 end" formats "begin\n 0[1] rescue 2 end" formats "10 // a" formats "10 // a" formats "foo(1, 2,)" formats "foo(1, 2,)" formats "break 1 , *2" formats "break 1 , *2" formats "if 1 &&\n2 &&\n3\n4\nend" formats "if 1 &&\n2 &&\n3\n4\nend" formats "case 1\nwhen 1 then 1\nwhen 123 then 2\nwhen 1..123 then 3\nelse 4\nend" formats "case 1\nwhen 1 then 1\nwhen 123 then 2\nwhen 1..123 then 3\nelse 4\nend" formats "def foo ( @x, @y) \n end" formats "def foo ( @x, @y) \n end" formats "if 1\n2\nelsif\n3\n4\nend" formats "if 1\n2\nelsif\n3\n4\nend" formats "enum Foo\n {% begin %}\n A\n B\n C\n {% end %}\nend" formats "enum Foo\n {% begin %}\n A\n B\n C\n {% end %}\nend" formats "{{ foo <<-X\nbar\nX\n}}" formats "{{ foo <<-X\nbar\nX\n}}" formats "# ```text\n# 1 + 2\n# ```\n#\n# ```\n# 3 + 4\n# ```" formats "# ```text\n# 1 + 2\n# ```\n#\n# ```\n# 3 + 4\n# ```" formats "1.!= { 3 }" formats "1.!= { 3 }" formats "%i{one( two( three)}" formats "%i{one( two( three)}" formats "asm(\n# foo\n\"nop\"\n# bar\n)" formats "asm(\n# foo\n\"nop\"\n# bar\n)" formats "macro flags\n {% if 1 %}\\\n 1 {% else %}\\\n {% end %}\\\nend" formats "macro flags\n {% if 1 %}\\\n 1 {% else %}\\\n {% end %}\\\nend" formats "def a\n b(\n 1, # x\n # y\n a: 1, # x\n # y\n b: 2 # z\n )\nend" formats "def a\n b(\n 1, # x\n # y\n a: 1, # x\n # y\n b: 2 # z\n )\nend" formats "foo.responds_to? :bar\n1" formats "foo.responds_to? :bar\n1" formats "macro foo\n \\{\nend" formats "macro foo\n \\{\nend" formats "macro [](x)\nend" formats "macro [](x)\nend" formats "1\n# hello\n\n\n" formats "1\n# hello\n\n\n" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] baz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] baz\n); end" formats "<<-FOO\nfoo\nfoo\nFOO" formats "<<-FOO\nfoo\nfoo\nFOO" formats "[\n [\n 1,\n ], [\n 2,\n ], [\n 3,\n ],\n]" formats "[\n [\n 1,\n ], [\n 2,\n ], [\n 3,\n ],\n]" formats "foo[] =1" formats "foo[] =1" formats "a+1" formats "a+1" formats "{ 1 => 2 }" formats "{ 1 => 2 }" formats "while 1;\n2; end" formats "while 1;\n2; end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "def foo(\n @[MyAnn]\n bar\n); end" formats "class Foo\n# nothing\nend" formats "class Foo\n# nothing\nend" formats "foo &.>=(2)" formats "foo &.>=(2)" formats "foo bar, \\\nbaz" formats "foo bar, \\\nbaz" formats "class Foo \n\n 1 \n\nend" formats "class Foo \n\n 1 \n\nend" formats "foo.%(bar)" formats "foo.%(bar)" formats "asm(\"a\" ::: \"f\"\n)" formats "asm(\"a\" ::: \"f\"\n)" formats "foo([\n 1, 2,\n 3, 4,\n])" formats "foo([\n 1, 2,\n 3, 4,\n])" formats "<<-HTML\n \#{__FILE__}\n HTML" formats "<<-HTML\n \#{__FILE__}\n HTML" formats "unless a\n2\n3\nelse\n4\n5\nend" formats "unless a\n2\n3\nelse\n4\n5\nend" formats "@x[ 1 ] &&= 2" formats "@x[ 1 ] &&= 2" formats "true" formats "true" formats "asm(\"a\" : : : : \"volatile\")" formats "asm(\"a\" : : : : \"volatile\")" formats "<<-HTML\n \#{1}x\n y\n HTML" formats "<<-HTML\n \#{1}x\n y\n HTML" formats "yield( 1 )" formats "yield( 1 )" formats "def foo(@[AnnOne] @[AnnTwo] & ); end" formats "def foo(@[AnnOne] @[AnnTwo] & ); end" assert assert formats "if a\n b &c\nend" formats "if a\n b &c\nend" formats "macro foo\n {{ 1 + 2 }}\\\n 1\n end" formats "macro foo\n {{ 1 + 2 }}\\\n 1\n end" formats "1 .. 2" formats "1 .. 2" formats "<<-HTML\n \#{\"fo\#{\"o\"}\"}\n HTML" formats "<<-HTML\n \#{\"fo\#{\"o\"}\"}\n HTML" formats "\"\" + <<-END\n bar\n END" formats "\"\" + <<-END\n bar\n END" formats "enum Foo\nA \nend" formats "enum Foo\nA \nend" formats "def foo\nend\n\ndef bar\nend\n\n# foo" formats "def foo\nend\n\ndef bar\nend\n\n# foo" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "{\n variables => true,\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "if 1\n2\nend\nif 3\nend" formats "if 1\n2\nend\nif 3\nend" formats "case\nend" formats "case\nend" formats "lib Foo\n $foo = hello : Int32 \nend" formats "lib Foo\n $foo = hello : Int32 \nend" formats "lib Foo\n fun foo =\n\n\n bar(Int32) : Int32\nend" formats "lib Foo\n fun foo =\n\n\n bar(Int32) : Int32\nend" formats "<<-HTML\n \#{\"foo\"}\#{1}\n HTML" formats "<<-HTML\n \#{\"foo\"}\#{1}\n HTML" formats "foo(baz(x, y) do\n 1 + 2\nend)" formats "foo(baz(x, y) do\n 1 + 2\nend)" formats "macro foo\n {{x}} <<-FOO\n hello \n FOO\nend" formats "macro foo\n {{x}} <<-FOO\n hello \n FOO\nend" formats "a&-1" formats "a&-1" formats "foo a , b , x: 1" formats "foo a , b , x: 1" formats "break { {1, 2}, {3, 4} }" formats "break { {1, 2}, {3, 4} }" formats "#######" formats "#######" formats "lib Foo\n fun foo =\n bar(Int32,\n Int32) : Int32\nend" formats "lib Foo\n fun foo =\n bar(Int32,\n Int32) : Int32\nend" formats "def a\n [\n 1, # x\n # y\n ]\nend" formats "def a\n [\n 1, # x\n # y\n ]\nend" formats "foo(1, ) { }" formats "foo(1, ) { }" formats "foo.as Int32*" formats "foo.as Int32*" formats "case 1 \n when 2 ; 3 \n when 4 ; 5\nend" formats "case 1 \n when 2 ; 3 \n when 4 ; 5\nend" formats "def foo\n2 # foo\nend" formats "def foo\n2 # foo\nend" formats "Union(Foo::Bar?, Baz?, Qux(T, U?))" formats "Union(Foo::Bar?, Baz?, Qux(T, U?))" formats "foo.bar += \n1" formats "foo.bar += \n1" formats "a = foo &.bar do\n 1 + 2\nend" formats "a = foo &.bar do\n 1 + 2\nend" formats "{%\n unless true\n 1\n end\n%}" formats "{%\n unless true\n 1\n end\n%}" formats "Hash{\n foo => <<-EOF\n foo\n EOF\n}" formats "Hash{\n foo => <<-EOF\n foo\n EOF\n}" formats "lib Foo\n fun foo(Int32) : Int32\nend" formats "lib Foo\n fun foo(Int32) : Int32\nend" formats "def foo(\n **a\n # comment\n)\n 1\nend" formats "def foo(\n **a\n # comment\n)\n 1\nend" formats "if 1\ncase 1\nwhen 2\n3\nend\nend" formats "if 1\ncase 1\nwhen 2\n3\nend\nend" formats "foo.bar\n .baz(\n 1\n )" formats "foo.bar\n .baz(\n 1\n )" formats "next( 1 , 2 )" formats "next( 1 , 2 )" formats "%x(foo \#{ bar })" formats "%x(foo \#{ bar })" formats "begin\nend\n\n# a\n" formats "begin\nend\n\n# a\n" formats "b &.[c].d" formats "b &.[c].d" formats "bar do\n foo <<-X\n bar\n X\nend" formats "bar do\n foo <<-X\n bar\n X\nend" formats "->( x , y ) { x }" formats "->( x , y ) { x }" formats "lib Foo\nstruct Foo\nend\nend" formats "lib Foo\nstruct Foo\nend\nend" formats " <<-EOF\n 1\n EOF" formats " <<-EOF\n 1\n EOF" formats " Array( {x: Int32, y: String } )" formats " Array( {x: Int32, y: String } )" formats "\"\#{\"foo\"}\"" formats "\"\#{\"foo\"}\"" formats "def foo ( &@block) \n end" formats "def foo ( &@block) \n end" formats "{\n 1 => 2, 3 => 4,\n 567 => 8910,\n}" formats "{\n 1 => 2, 3 => 4,\n 567 => 8910,\n}" formats "\"foo\" \\\n \"bar\"" formats "\"foo\" \\\n \"bar\"" formats "foo.bar(&.% baz)" formats "foo.bar(&.% baz)" formats "if 1\n2\n3\n# foo\nend" formats "if 1\n2\n3\n# foo\nend" formats "a = \\\n # foo\n nil" formats "a = \\\n # foo\n nil" formats "foo : (String -> String?) | (String)" formats "foo : (String -> String?) | (String)" formats "a &.b.c.as(C)" formats "a &.b.c.as(C)" formats "%{hello}" formats "%{hello}" formats "macro foo\n def bar\n {{\n 1 + 2\n }}\n end\nend" formats "macro foo\n def bar\n {{\n 1 + 2\n }}\n end\nend" formats "abstract def foo\nabstract def bar" formats "abstract def foo\nabstract def bar" formats "def foo ( x : Int32 ) \n end" formats "def foo ( x : Int32 ) \n end" formats " {% if 1 %} {% if 2 %} 2 {% end %} {% end %}" formats " {% if 1 %} {% if 2 %} 2 {% end %} {% end %}" formats " ( 1; 2; 3 ) " formats " ( 1; 2; 3 ) " formats "begin\n call\n # comment\nrescue\n call\n # comment\nelse\n call\n # comment\nensure\n call\n # comment\nend" formats "begin\n call\n # comment\nrescue\n call\n # comment\nelse\n call\n # comment\nensure\n call\n # comment\nend" formats "foo[1, &.bar]" formats "foo[1, &.bar]" formats "foo(\n# x\n1,\n\n# y\nz: 2\n)" formats "foo(\n# x\n1,\n\n# y\nz: 2\n)" formats "next *1 ,2" formats "next *1 ,2" formats "->( x : Int32 , y ) { x }" formats "->( x : Int32 , y ) { x }" formats "&- 1" formats "&- 1" formats "foo(1 ||\n # foo\n 2)" formats "foo(1 ||\n # foo\n 2)" formats "a = \\\n # foo\n bar(1)" formats "a = \\\n # foo\n bar(1)" formats "->{}" formats "->{}" formats "macro foo\n def bar \n end \n end" formats "macro foo\n def bar \n end \n end" formats "enum Foo\nA = 1\nend" formats "enum Foo\nA = 1\nend" formats "yield 1 , *2" formats "yield 1 , *2" formats "1 &&\n2" formats "1 &&\n2" formats "a, b = \nif 1\n2\nend" formats "a, b = \nif 1\n2\nend" formats "def foo ( @x) \n end" formats "def foo ( @x) \n end" formats "[ # foo\n 1,\n]" formats "[ # foo\n 1,\n]" formats "def foo(&: Int32)\nend" formats "def foo(&: Int32)\nend" formats "foo : (Array(String)?) | String" formats "foo : (Array(String)?) | String" formats "1 ||\n # foo\n 2" formats "1 ||\n # foo\n 2" formats "typeof( 1, 2, 3 )" formats "typeof( 1, 2, 3 )" formats "foo do \n x \n end" formats "foo do \n x \n end" formats "if a\nelse\n2\nend" formats "if a\nelse\n2\nend" formats "macro foo\n {% if 1 %} 2 {% else %} 3 {% end %}\nend" formats "macro foo\n {% if 1 %} 2 {% else %} 3 {% end %}\nend" formats "b &.[c]?.d" formats "b &.[c]?.d" formats "case 1\nwhen a; 2\nelse; ; b\nend" formats "case 1\nwhen a; 2\nelse; ; b\nend" formats "def foo( x , & block : Int32->Float64)\nend" formats "def foo( x , & block : Int32->Float64)\nend" formats "lib Foo\nfun foo : Int32\nend" formats "lib Foo\nfun foo : Int32\nend" formats "case 1\nwhen 1, # 1\n 2, # 2\n 3 # 3\n 1\nend" formats "case 1\nwhen 1, # 1\n 2, # 2\n 3 # 3\n 1\nend" formats "enum Foo; A = 1; end" formats "enum Foo; A = 1; end" formats "macro foo\n {% if 1 %} 2 {% end %}\nend" formats "macro foo\n {% if 1 %} 2 {% end %}\nend" formats "\"hel\nlo\"" formats "\"hel\nlo\"" formats "foo \\\nbar" formats "foo \\\nbar" formats "NamedTuple()" formats "NamedTuple()" formats "(1)" formats "(1)" formats "case 1 \n when 2 ;\n 3 \n end" formats "case 1 \n when 2 ;\n 3 \n end" formats "foo.\nbar" formats "foo.\nbar" formats "def foo(\n @[MyAnn] bar\n); end" formats "def foo(\n @[MyAnn] bar\n); end" formats "case 1 # foo\nwhen 2 then 3 # bar\nwhen 4 then 5 # baz\nelse 6 # zzz\nend" formats "case 1 # foo\nwhen 2 then 3 # bar\nwhen 4 then 5 # baz\nelse 6 # zzz\nend" formats "()" formats "()" formats "offsetof( String, @length )" formats "offsetof( String, @length )" formats "foo &.is_a?(T)" formats "foo &.is_a?(T)" formats "def foo # bar\n # baz\nend" formats "def foo # bar\n # baz\nend" formats "1.[]=() { 3 }" formats "1.[]=() { 3 }" formats "(\n a = 1\n a\n)" formats "(\n a = 1\n a\n)" formats "1\n.as?(Int32)" formats "1\n.as?(Int32)" formats "lib Foo\nalias Foo = Bar -> \n$a : Int32\nend" formats "lib Foo\nalias Foo = Bar -> \n$a : Int32\nend" formats "def x(@y = ->(z) {})\nend" formats "def x(@y = ->(z) {})\nend" formats "{} of A => B\n{} of Foo => Bar" formats "{} of A => B\n{} of Foo => Bar" formats "->Foo.foo" formats "->Foo.foo" formats "foo = [1, [2,\n 3],\n 4]" formats "foo = [1, [2,\n 3],\n 4]" formats "begin\n query = <<-HEREDOC\n foo\n HEREDOC\nend" formats "begin\n query = <<-HEREDOC\n foo\n HEREDOC\nend" formats "select \n when foo then 2 \n end" formats "select \n when foo then 2 \n end" formats "def a\n {\n 1, # x\n # y\n }\nend" formats "def a\n {\n 1, # x\n # y\n }\nend" formats "@[Foo]\ndef foo\nend" formats "@[Foo]\ndef foo\nend" formats "macro foo( x , y )\nend" formats "macro foo( x , y )\nend" formats "macro foo\n {% for x in y %}\\ 2 {% end %}\\\nend" formats "macro foo\n {% for x in y %}\\ 2 {% end %}\\\nend" formats "def func # comment\n (1 + 2) / 3\nend" formats "def func # comment\n (1 + 2) / 3\nend" formats "foo : A(B)\nbar : C" formats "foo : A(B)\nbar : C" formats "def foo ( bar @@select) \n end" formats "def foo ( bar @@select) \n end" formats "foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "foo(1, 2, {\n foo: 1,\n bar: 2,\n})" formats "foo = 1\n->foo.foo!" formats "foo = 1\n->foo.foo!" formats "foo(1 + \n2)" formats "foo(1 + \n2)" formats "class Foo\ndef foo (\nx ,\n y ) \n end\nend" formats "class Foo\ndef foo (\nx ,\n y ) \n end\nend" formats "a = # foo\n bar(1)" formats "a = # foo\n bar(1)" formats "a = if 1\n2\n3\nend" formats "a = if 1\n2\n3\nend" formats "require \"foo\"\n\n@x : Int32\n\nclass Bar\nend" formats "require \"foo\"\n\n@x : Int32\n\nclass Bar\nend" formats "lib Foo\n $foo : Int32 \nend" formats "lib Foo\n $foo : Int32 \nend" formats "def foo(x : A(B), y)\nend" formats "def foo(x : A(B), y)\nend" formats "def foo( & \n )\nend" formats "def foo( & \n )\nend" formats "long_variable_name = [1, 2, 3, # foo\n 4, 5, 6]" formats "long_variable_name = [1, 2, 3, # foo\n 4, 5, 6]" formats "1.[]= do\nend" formats "1.[]= do\nend" formats "foo(bar(baz3 do\nend))" formats "foo(bar(baz3 do\nend))" formats "{% if z %}\n 1\n{% end %}\n\ndef foo\n z =\n 123 + # foo\n 4 # bar\n\n 1\nend" formats "{% if z %}\n 1\n{% end %}\n\ndef foo\n z =\n 123 + # foo\n 4 # bar\n\n 1\nend" formats " <<-HTML\n foo\nHTML" formats " <<-HTML\n foo\nHTML" formats "select\nwhen foo # foo\n # bar\nelse # foo\n # bar\nend" formats "select\nwhen foo # foo\n # bar\nelse # foo\n # bar\nend" formats "def foo\n 1\n #\n\n\nrescue\nend" formats "def foo\n 1\n #\n\n\nrescue\nend" formats "def foo(x)\n {% if true %}\n # comment\n Foo = 1\n B = 2\n {% end %}\nend" formats "def foo(x)\n {% if true %}\n # comment\n Foo = 1\n B = 2\n {% end %}\nend" formats "x : (A -> )" formats "x : (A -> )" formats "\"foo \#{ 1 } \#{ __DIR__ }\"" formats "\"foo \#{ 1 } \#{ __DIR__ }\"" formats "def foo(*y, **z)\nend" formats "def foo(*y, **z)\nend" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n\n @[MyAnn]\n\n biz\n); end" formats "def foo(\n @[MyAnn]\n @[MyAnn]\n bar,\n\n @[MyAnn] @[MyAnn] baz,\n\n @[MyAnn]\n\n @[MyAnn]\n\n biz\n); end" formats "[\n a() # b\n]" formats "[\n a() # b\n]" formats "case 1\nwhen 2\n#comment\nend" formats "case 1\nwhen 2\n#comment\nend" formats "%[hello]" formats "%[hello]" formats "<<-FOO\nfoo\nFOO" formats "<<-FOO\nfoo\nFOO" formats "module Foo ( U, *T ); 1; end" formats "module Foo ( U, *T ); 1; end" formats "foo &.bar.as?(T)" formats "foo &.bar.as?(T)" formats "foo { |x| (x).a }" formats "foo { |x| (x).a }" formats "macro foo\n %foo{x.id+2}\nend" formats "macro foo\n %foo{x.id+2}\nend" formats "::Tuple(T)" formats "::Tuple(T)" formats "lib Foo\n fun bar = Bar\nend" formats "lib Foo\n fun bar = Bar\nend" formats "next( *1 , *2 )" formats "next( *1 , *2 )" formats "foo a , *b" formats "foo a , *b" formats "a = 1\nb, c = 2, 3\n{% begin %}\n a |= 1\n b |= 2\n c |= 3\n{% end %}" formats "a = 1\nb, c = 2, 3\n{% begin %}\n a |= 1\n b |= 2\n c |= 3\n{% end %}" formats "[\n # foo\n 1,\n\n # bar\n 2,\n]" formats "[\n # foo\n 1,\n\n # bar\n 2,\n]" formats "foo()" formats "foo()" formats "@[ Foo(foo: 1) ]\ndef foo\nend" formats "@[ Foo(foo: 1) ]\ndef foo\nend" formats "{% if true %}\n # x\n{% end %}" formats "{% if true %}\n # x\n{% end %}" formats "->@foo.foo?" formats "->@foo.foo?" formats "if a\n2\n3\nend" formats "if a\n2\n3\nend" formats "あ.い = 1" formats "あ.い = 1" formats "{ {% begin %}1{% end %}, nil }" formats "{ {% begin %}1{% end %}, nil }" formats "return 1 , *2" formats "return 1 , *2" formats "{\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "{\n query => <<-HEREDOC,\n foo\n HEREDOC\n}" formats "a = \nif 1\n2\nend" formats "a = \nif 1\n2\nend" formats "<<-HTML\n hello \n HTML" formats "<<-HTML\n hello \n HTML" formats "def foo (\nx ,\n y ) \n end" formats "def foo (\nx ,\n y ) \n end" formats "def foo\n a = 1; # foo\n a = 2; # bar\nend\n" formats "def foo\n a = 1; # foo\n a = 2; # bar\nend\n" formats "def foo(a,\n &block)\nend" formats "def foo(a,\n &block)\nend" formats "あ.い, う.え.お = 1, 2" formats "あ.い, う.え.お = 1, 2" formats "def foo( x , & block : Int32 ->)\nend" formats "def foo( x , & block : Int32 ->)\nend" formats "class Foo\nend\nclass Bar\nend" formats "class Foo\nend\nclass Bar\nend" formats "@[Foo]" formats "@[Foo]" formats " ((1) + 2)" formats " ((1) + 2)" formats "foo a , **b" formats "foo a , **b" formats "{ A: 1 }\n" formats "{ A: 1 }\n" formats "1\nyield\n2" formats "1\nyield\n2" formats "{ %() }" formats "{ %() }" formats "foo = 1\n->foo.bar=(Int32)" formats "foo = 1\n->foo.bar=(Int32)" formats "foo(\n 1,\n) do\n 2\nend" formats "foo(\n 1,\n) do\n 2\nend" formats "if 1\n2 # foo\nend" formats "if 1\n2 # foo\nend" formats "asm(\"a\" : :: : \"volatile\")" formats "asm(\"a\" : :: : \"volatile\")" formats "foo = 1\n->foo.bar(Int32*)" formats "foo = 1\n->foo.bar(Int32*)" formats "foo.% bar" formats "foo.% bar" formats "__LINE__" formats "__LINE__" formats "begin\n1\nrescue ex\n3\nelse\n4\nend" formats "begin\n1\nrescue ex\n3\nelse\n4\nend" formats "foo.[1]" formats "foo.[1]" formats "foo(\n 1,\n) {\n 2\n}" formats "foo(\n 1,\n) {\n 2\n}" formats "class Foo\n macro foo\n 1\n end\nend" formats "class Foo\n macro foo\n 1\n end\nend" formats "%i(one two three)" formats "%i(one two three)" formats "[1,\n2,\n3\n]" formats "[1,\n2,\n3\n]" formats " {% if 1 %} 2 {% end %}" formats " {% if 1 %} 2 {% end %}" formats "foo({\n 1 => 2,\n 3 => {\n 4 => 5,\n },\n})" formats "foo({\n 1 => 2,\n 3 => {\n 4 => 5,\n },\n})" formats "foo(\n 1,\n # 2,\n # 3,\n)" formats "foo(\n 1,\n # 2,\n # 3,\n)" formats " <<-EOF\n 1\n 2\n EOF" formats " <<-EOF\n 1\n 2\n EOF" formats "foo &.[]( 1, 2 )" formats "foo &.[]( 1, 2 )" formats " [ 1 , 2 , 3 ] " formats " [ 1 , 2 , 3 ] " formats "[\n 1, 2, # foo\n 3,\n]" formats "[\n 1, 2, # foo\n 3,\n]" formats "def //(x)\n 1\nend" formats "def //(x)\n 1\nend" formats "@@a" formats "@@a" formats "{\n 1 => 2,\n 10 => 30,\n 30 => 40,\n \"foobar\" => 50,\n \"coco\" => 60,\n}" formats "{\n 1 => 2,\n 10 => 30,\n 30 => 40,\n \"foobar\" => 50,\n \"coco\" => 60,\n}" formats "foo (1), 2" formats "foo (1), 2" formats "yield( 1 , 2 )" formats "yield( 1 , 2 )" formats " <<-HTML\n hello \n world \n HTML" formats " <<-HTML\n hello \n world \n HTML" formats "foo x, self // 1" formats "foo x, self // 1" formats "$~" formats "$~" formats "alias Foo::Bar= Baz" formats "alias Foo::Bar= Baz" formats "! 1" formats "! 1" formats "break( 1 )" formats "break( 1 )" formats "begin\n1\n2\n3\nend" formats "begin\n1\n2\n3\nend" formats "1.>= do\nend" formats "1.>= do\nend" formats "if 1\n2\nelsif\n3\n4\nelsif 5\n6\nend" formats "if 1\n2\nelsif\n3\n4\nelsif 5\n6\nend" formats "abstract class Foo\nend" formats "abstract class Foo\nend" formats "def +(x)\nend" formats "def +(x)\nend" formats "foo[]" formats "foo[]" formats "1 ... 2" formats "1 ... 2" formats "{ {{FOO}}, nil}" formats "{ {{FOO}}, nil}" formats "foo 1, do\n2\nend" formats "foo 1, do\n2\nend" formats "->foo" formats "->foo" formats "if 1\n node.is_a?(T)\nend" formats "if 1\n node.is_a?(T)\nend" formats "next {1, 2}, 3" formats "next {1, 2}, 3" formats "foo(1,\n &.bar)" formats "foo(1,\n &.bar)" formats "break {1, 2}, {3, 4}" formats "break {1, 2}, {3, 4}" formats "x = a do\n 1 ||\n 2\nend" formats "x = a do\n 1 ||\n 2\nend" formats "def foo=(x)\nend" formats "def foo=(x)\nend" formats "def foo\n1\nend" formats "def foo\n1\nend" formats "SomeLib.UppercasedFunCall" formats "SomeLib.UppercasedFunCall" formats "def foo(x)\n case 1\n when self // 2\n 3\n end\nend" formats "def foo(x)\n case 1\n when self // 2\n 3\n end\nend" formats "[1,\n2,\n3]" formats "[1,\n2,\n3]" formats "a , b = 1 , 2" formats "a , b = 1 , 2" formats "case 1 \n in Int32 \n 3 \n end" formats "case 1 \n in Int32 \n 3 \n end" formats "getter foo : Int32 # comment\n\ndef foo\nend" formats "getter foo : Int32 # comment\n\ndef foo\nend" formats "foo[&.bar] ||= 1" formats "foo[&.bar] ||= 1" formats "\"\#{ # foo\n foo = 1\n}\"" formats "\"\#{ # foo\n foo = 1\n}\"" formats ":&**" formats ":&**" formats "def foo(\n @[MyAnn] bar\n); end" formats "def foo(\n @[MyAnn] bar\n); end" formats "def foo\n 1\nend\n\n# Comment\n\ndef bar\n 2\nend" formats "def foo\n 1\nend\n\n# Comment\n\ndef bar\n 2\nend" formats "def foo ( x ) \n end" formats "def foo ( x ) \n end" formats "foo(1, ) do\nend" formats "foo(1, ) do\nend" formats ":>>" formats ":>>" Parser parses "foo { 1 }" parses "foo { 1 }" parses "def [](x); end" parses "def [](x); end" says syntax error on "macro as?; end" says syntax error on "macro as?; end" parses "def self.-(); end;" parses "def self.-(); end;" parses "foo = 1; ->foo.bar(Int32)" parses "foo = 1; ->foo.bar(Int32)" parses "else : Int32" parses "else : Int32" parses "foo &.each do\nend" parses "foo &.each do\nend" parses "::A::B" parses "::A::B" parses "1 =~ 2" parses "1 =~ 2" parses "foo(0, n + 2)" parses "foo(0, n + 2)" parses "def ===(*args, **opts); end" parses "def ===(*args, **opts); end" parses "foo.!~(1, 2)" parses "foo.!~(1, 2)" parses "def []=(value); end" parses "def []=(value); end" parses "foo.=~ 1, 2" parses "foo.=~ 1, 2" parses "foo(n &+ 2)" parses "foo(n &+ 2)" parses "case {1}\nin {false}; 2; end" parses "case {1}\nin {false}; 2; end" says syntax error on "next[0]= 1" says syntax error on "next[0]= 1" says syntax error on "macro foo; {% foo = 1 }; end" says syntax error on "macro foo; {% foo = 1 }; end" says syntax error on "def foo(foo fun); end" says syntax error on "def foo(foo fun); end" parses "@@a : Foo = 1" parses "@@a : Foo = 1" parses "property next : Int32" parses "property next : Int32" parses "-> do end" parses "-> do end" parses "def foo(x : *T -> R); end" parses "def foo(x : *T -> R); end" parses "foo.>=(1, 2) { 3 }" parses "foo.>=(1, 2) { 3 }" parses "macro foo\n\"\\\\\"\nend" parses "macro foo\n\"\\\\\"\nend" says syntax error on "a = 1; a += break" says syntax error on "a = 1; a += break" says syntax error on "foo(**bar, *x)" says syntax error on "foo(**bar, *x)" parses ":[]?" parses ":[]?" parses "next *{1, 2}" parses "next *{1, 2}" parses "foo%i" parses "foo%i" parses "foo(n &* 2)" parses "foo(n &* 2)" parses ":<<" parses ":<<" parses "break : Int32" parses "break : Int32" parses "macro foo;if var;true;end;end" parses "macro foo;if var;true;end;end" parses "foo(z: 0, a: n == 2)" parses "foo(z: 0, a: n == 2)" parses "foo.!.!" parses "foo.!.!" parses "offsetof(X, 1)" parses "offsetof(X, 1)" parses "def <(); end;" parses "def <(); end;" parses "1.[](2)" parses "1.[](2)" parses "foo = 1; foo -1" parses "foo = 1; foo -1" parses "foo(n !~ 2)" parses "foo(n !~ 2)" says syntax error on "'''" says syntax error on "'''" says syntax error on "offsetof(X, 1.0)" says syntax error on "offsetof(X, 1.0)" parses "def ~(); end;" parses "def ~(); end;" says syntax error on "a.[]() += 1" says syntax error on "a.[]() += 1" says syntax error on "x, self = 1, 2" says syntax error on "x, self = 1, 2" parses "{A: 1, B: 2}" parses "{A: 1, B: 2}" parses "foo = 1; foo(-1)" parses "foo = 1; foo(-1)" parses "while : Int32" parses "while : Int32" says syntax error on "return 1 foo" says syntax error on "return 1 foo" parses "case :foo; when :bar; 2; end" parses "case :foo; when :bar; 2; end" parses "->Foo.>=(Int32)" parses "->Foo.>=(Int32)" parses "a = 1; a %=\n1" parses "a = 1; a %=\n1" says syntax error on "a = 1; a += next" says syntax error on "a = 1; a += next" parses "\"foo\#{bar}baz\"" parses "\"foo\#{bar}baz\"" parses "Foo?" parses "Foo?" parses "foo = 1; b = 2; foo -b" parses "foo = 1; b = 2; foo -b" parses "foo.+" parses "foo.+" says syntax error on "a.b(), c.d = 1" says syntax error on "a.b(), c.d = 1" parses "def foo(a, &block : Int -> ); end" parses "def foo(a, &block : Int -> ); end" parses "def foo(@var); 1; end" parses "def foo(@var); 1; end" parses "a/b" parses "a/b" says syntax error on "def foo(foo unless); end" says syntax error on "def foo(foo unless); end" parses "def foo(@sizeof); end" parses "def foo(@sizeof); end" parses "property class : Int32" parses "property class : Int32" parses "a = 1; a ^= 1" parses "a = 1; a ^= 1" parses "1.[]?(2)" parses "1.[]?(2)" parses "a = 1" parses "a = 1" parses "property alias : Int32" parses "property alias : Int32" parses "foo 1.bar do\nend" parses "foo 1.bar do\nend" parses "def foo(@[Foo] &@block); end" parses "def foo(@[Foo] &@block); end" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "def foo(@@enum); end" parses "def foo(@@enum); end" 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.>= do end" parses "foo.>= do end" says syntax error on "foo { |(begin)| }" says syntax error on "foo { |(begin)| }" parses "begin; 1; rescue ::Foo; 2; end" parses "begin; 1; rescue ::Foo; 2; end" parses "def foo(@@yield); end" parses "def foo(@@yield); end" sets correct location of private method in enum sets correct location of private method in enum parses "a; if / /; / /; elsif / /; / /; end" parses "a; if / /; / /; elsif / /; / /; end" says syntax error on "def foo(unless); end" says syntax error on "def foo(unless); end" parses "foo(0, n === 2)" parses "foo(0, n === 2)" parses "asm(\"nop\" :: : :)" parses "asm(\"nop\" :: : :)" says syntax error on "def foo(foo true); end" says syntax error on "def foo(foo true); end" parses "{foo:'a', bar:'b'}" parses "{foo:'a', bar:'b'}" parses "foo(a: n > 2)" parses "foo(a: n > 2)" parses "enum Foo; {% if 1 %}2{% end %}; end" parses "enum Foo; {% if 1 %}2{% end %}; end" parses "def type(type); end" parses "def type(type); end" parses "n << 2" parses "n << 2" parses "property require : Int32" parses "property require : Int32" parses "def foo(a, b = a); end" parses "def foo(a, b = a); end" parses "def self./(); end;" parses "def self./(); end;" parses "->() : Int32 { }" parses "->() : Int32 { }" parses "def foo(begin foo); end" parses "def foo(begin foo); end" parses "1 // 2" parses "1 // 2" parses "Foo.bar x.y do\nend" parses "Foo.bar x.y do\nend" says syntax error on "def foo(**args, **args2); end" says syntax error on "def foo(**args, **args2); end" parses "nil?( )" parses "nil?( )" parses "{% begin %}%q( %s ){% end %}" parses "{% begin %}%q( %s ){% end %}" parses "a, b = 1, 2 if 3" parses "a, b = 1, 2 if 3" parses "false : Int32" parses "false : Int32" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "4./(2)" parses "4./(2)" parses "a = /=/" parses "a = /=/" parses "property macro : Int32" parses "property macro : Int32" parses "foo(/ /)" parses "foo(/ /)" parses "1+2*3" parses "1+2*3" parses "{1, 2, 3}" parses "{1, 2, 3}" parses ":==" parses ":==" parses "class Foo(T); end" parses "class Foo(T); end" parses "def foo(x @@module); end" parses "def foo(x @@module); end" says syntax error on "def foo(var : Foo+); end" says syntax error on "def foo(var : Foo+); end" parses "foo = 1; ->foo.*(Int32)" parses "foo = 1; ->foo.*(Int32)" parses "foo" parses "foo" parses "1 -\n2" parses "1 -\n2" says syntax error on "def foo(return); end" says syntax error on "def foo(return); end" parses "foo = 1; ->foo.>=(Int32)" parses "foo = 1; ->foo.>=(Int32)" parses "def foo(@@protected); end" parses "def foo(@@protected); end" says syntax error on "break[]" says syntax error on "break[]" parses "foo Bar { 1 }" parses "foo Bar { 1 }" parses "a()/3" parses "a()/3" parses "[] of {String, ->}" parses "[] of {String, ->}" says syntax error on "def foo(var = 1 : Int32); end" says syntax error on "def foo(var = 1 : Int32); end" parses "-@@foo" parses "-@@foo" parses "instance_alignof(\n Int32\n)" parses "instance_alignof(\n Int32\n)" parses "1 || 2" parses "1 || 2" parses "def ^(); end;" parses "def ^(); end;" parses "macro !~;end" parses "macro !~;end" parses "return {1, 2}" parses "return {1, 2}" parses "def foo(&); end" parses "def foo(&); end" parses "1 + 2" parses "1 + 2" parses "unless foo; 1; else; 2; end" parses "unless foo; 1; else; 2; end" parses "foo(a: n << 2)" parses "foo(a: n << 2)" parses "Int[8, 4,]" parses "Int[8, 4,]" parses "n &* 2" parses "n &* 2" parses "def foo(x); end; x" parses "def foo(x); end; x" parses "->Foo.//(Int32)" parses "->Foo.//(Int32)" parses "property true : Int32" parses "property true : Int32" parses "Foo({x: X, typeof: Y})" parses "Foo({x: X, typeof: Y})" parses "foo %w()" parses "foo %w()" says syntax error on "def foo(foo abstract); end" says syntax error on "def foo(foo abstract); end" parses "def foo(require foo); end" parses "def foo(require foo); end" parses "->foo" parses "->foo" says syntax error on "def foo(module); end" says syntax error on "def foo(module); end" parses "a : Foo*" parses "a : Foo*" parses "1 ensure 2 if 3" parses "1 ensure 2 if 3" says syntax error on "A = begin; B = 1; end" says syntax error on "A = begin; B = 1; end" says syntax error on "foo { |(with)| }" says syntax error on "foo { |(with)| }" parses "foo { |(_, c)| c }" parses "foo { |(_, c)| c }" parses "def foo\n1\nend" parses "def foo\n1\nend" parses "foo(n + 2)" parses "foo(n + 2)" parses "foo.bar [1]" parses "foo.bar [1]" parses "def >=(*args, **opts, &); end" parses "def >=(*args, **opts, &); end" parses "{{ foo.nil? }}" parses "{{ foo.nil? }}" parses "1 ** -x" parses "1 ** -x" parses "foo(&block)" parses "foo(&block)" parses "foo 1, a: 1, b: 2\n1" parses "foo 1, a: 1, b: 2\n1" parses "def foo(*y : *T); 1; end" parses "def foo(*y : *T); 1; 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 "->foo?" parses "->foo?" says syntax error on "foo { |a b| }" says syntax error on "foo { |a b| }" says syntax error on "def foo(require); end" says syntax error on "def foo(require); end" parses "A.new(\"x\", B.new(\"y\"))" parses "A.new(\"x\", B.new(\"y\"))" parses "property ensure : Int32" parses "property ensure : Int32" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "(bar do\nend)" parses "(bar do\nend)" parses "x = 1; foo x {\n}" parses "x = 1; foo x {\n}" parses "call(foo : A, end : B)" parses "call(foo : A, end : B)" says syntax error on "return ... 1" says syntax error on "return ... 1" parses "lib LibC\nalias Foo = Bar\nend" parses "lib LibC\nalias Foo = Bar\nend" parses "a.b |=\n1" parses "a.b |=\n1" parses "foo.%(1, 2)" parses "foo.%(1, 2)" says syntax error on "def Foo(Int32).bar;end" says syntax error on "def Foo(Int32).bar;end" parses "enum Foo; A\nB; C\nD = 1; end" parses "enum Foo; A\nB; C\nD = 1; end" says syntax error on "fun foo(Int32); end" says syntax error on "fun foo(Int32); end" parses "def self.=~(); end;" parses "def self.=~(); end;" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" says syntax error on "1 ? : 2 : 3" says syntax error on "1 ? : 2 : 3" parses "def foo(@var = 1); 1; end" parses "def foo(@var = 1); 1; end" parses "def []=(*args, **opts); end" parses "def []=(*args, **opts); end" parses "{} of Int => Double" parses "{} of Int => Double" says syntax error on "Hash{\"foo\": 1}" says syntax error on "Hash{\"foo\": 1}" parses "def self.+(); end;" parses "def self.+(); end;" parses "def foo(x @instance_sizeof); end" parses "def foo(x @instance_sizeof); end" parses "foo(a: n =~ 2)" parses "foo(a: n =~ 2)" parses "foo.<= 1, 2" parses "foo.<= 1, 2" parses "foo.bar.as(Bar)" parses "foo.bar.as(Bar)" parses "x.foo(a: 1, b: 2)" parses "x.foo(a: 1, b: 2)" parses "macro <=>;end" parses "macro <=>;end" parses "alignof(\n Int32\n)" parses "alignof(\n Int32\n)" parses "def foo(x @def); end" parses "def foo(x @def); end" says syntax error on "foo { |(private)| }" says syntax error on "foo { |(private)| }" says syntax error on "b, 1 == 2, a = 4" says syntax error on "b, 1 == 2, a = 4" says syntax error on "def self.as?; end" says syntax error on "def self.as?; end" parses "1.tap do |x|; 1; rescue; x; end" parses "1.tap do |x|; 1; rescue; x; end" parses "a = 1; a -= 1" parses "a = 1; a -= 1" parses "->Foo.foo!" parses "->Foo.foo!" parses "def -(); end" parses "def -(); end" parses "a = 1; a += 10 if a += 20" parses "a = 1; a += 10 if a += 20" says syntax error on "x--" says syntax error on "x--" says syntax error on "return == 1" says syntax error on "return == 1" parses "puts ~1" parses "puts ~1" parses "{% begin %}%r[\\A]{% end %}" parses "{% begin %}%r[\\A]{% end %}" parses "{% begin %}%x{ %s }{% end %}" parses "{% begin %}%x{ %s }{% end %}" parses "def foo(next foo); end" parses "def foo(next foo); end" parses "extend Foo\nif true; end" parses "extend Foo\nif true; end" says syntax error on "a = return" says syntax error on "a = return" parses "puts _" parses "puts _" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" says syntax error on "foo { |unless| }" says syntax error on "foo { |unless| }" parses "foo(n // 2)" parses "foo(n // 2)" parses "!1" parses "!1" parses "def foo(x @@protected); end" parses "def foo(x @@protected); end" parses "foo.^" parses "foo.^" parses "case 1\nin false; 2; end" parses "case 1\nin false; 2; end" parses "foo.==" parses "foo.==" parses "def foo(x @typeof); end" parses "def foo(x @typeof); end" parses "def foo\n1\nend\nif 1\nend" parses "def foo\n1\nend\nif 1\nend" parses "foo.===" parses "foo.===" says syntax error on "foo { |fun| }" says syntax error on "foo { |fun| }" says syntax error on "foo { |(instance_sizeof)| }" says syntax error on "foo { |(instance_sizeof)| }" parses "def self.foo=\n1\nend" parses "def self.foo=\n1\nend" parses "foo[*baz]" parses "foo[*baz]" parses "case 1\nin Int32; 2; end" parses "case 1\nin Int32; 2; end" parses "def foo ; 1 ; end" parses "def foo ; 1 ; end" says syntax error on "macro nil?; end" says syntax error on "macro nil?; end" parses "def foo(@@class); end" parses "def foo(@@class); end" says syntax error on "return &** 1" says syntax error on "return &** 1" parses "foo = 1; ->foo./(Int32)" parses "foo = 1; ->foo./(Int32)" 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(0, n - 2)" parses "foo(0, n - 2)" parses "foo unless 3" parses "foo unless 3" parses "{% begin %}%< %s >{% end %}" parses "{% begin %}%< %s >{% end %}" parses "return {1 => 2}" parses "return {1 => 2}" parses "def foo(@unless); end" parses "def foo(@unless); end" sets correct location of global path in annotation sets correct location of global path in annotation parses "def foo(var : self*); end" parses "def foo(var : self*); end" parses "1 rescue 2" parses "1 rescue 2" parses "enum Foo; @@foo = 1\n A \n end" parses "enum Foo; @@foo = 1\n A \n end" parses "a = 1; a /=\n1" parses "a = 1; a /=\n1" parses "foo = 1; ->foo.|(Int32)" parses "foo = 1; ->foo.|(Int32)" parses "1.!(\n)" parses "1.!(\n)" parses "1;+2" parses "1;+2" parses "{} of Int32 -> Int32 => Int32" parses "{} of Int32 -> Int32 => Int32" says syntax error on "{\n}" says syntax error on "{\n}" parses "def ==(); end" parses "def ==(); end" says syntax error on "*a" says syntax error on "*a" says syntax error on "foo { |(protected)| }" says syntax error on "foo { |(protected)| }" parses "macro foo;end" parses "macro foo;end" says syntax error on "case 1 == 1 a; when 2; end" says syntax error on "case 1 == 1 a; when 2; end" parses "{[] of Foo, self.foo}" parses "{[] of Foo, self.foo}" parses "def foo(var1, var2); end" parses "def foo(var1, var2); end" parses "def foo(@@return); end" parses "def foo(@@return); end" parses "->::foo?" parses "->::foo?" parses "def foo(@while); end" parses "def foo(@while); end" parses "def foo(private foo); end" parses "def foo(private foo); end" says syntax error on "foo { |case| }" says syntax error on "foo { |case| }" says syntax error on "next + 1" says syntax error on "next + 1" says syntax error on "*a === 1" says syntax error on "*a === 1" parses "foo.- do end" parses "foo.- do end" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "require \"foo\"" parses "require \"foo\"" parses "foo(&.as?(T).bar)" parses "foo(&.as?(T).bar)" parses "[\n1,2\n]" parses "[\n1,2\n]" parses "enum Foo; {{1}}; end" parses "enum Foo; {{1}}; end" parses "->foo(Void*)" parses "->foo(Void*)" parses "(1 .. )" parses "(1 .. )" parses "def foo; 1; 2; end" parses "def foo; 1; 2; end" parses "n >> 2" parses "n >> 2" parses "def foo(x @lib); end" parses "def foo(x @lib); end" parses "foo.!~ do end" parses "foo.!~ do end" says syntax error on "next &* 1" says syntax error on "next &* 1" parses "foo(Bar { 1 })" parses "foo(Bar { 1 })" parses "def foo(@@offsetof); end" parses "def foo(@@offsetof); end" parses "a.b /=\n1" parses "a.b /=\n1" parses "foo(z: 0, a: n & 2)" parses "foo(z: 0, a: n & 2)" parses "lib LibC\nfun getch = GetChar\nend" parses "lib LibC\nfun getch = GetChar\nend" parses "def foo(offsetof foo); end" parses "def foo(offsetof foo); end" parses "def ===(); end;" parses "def ===(); end;" 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 "foo &.%(1)" parses "foo &.%(1)" parses "def foo(x) : Int32\n1\nend" parses "def foo(x) : Int32\n1\nend" parses "foo(1, a: 1, b: 2)" parses "foo(1, a: 1, b: 2)" parses "(1; 2; 3)" parses "(1; 2; 3)" parses "include Foo" parses "include Foo" parses "def self.*(); end;" parses "def self.*(); end;" says syntax error on "foo **bar, *x" says syntax error on "foo **bar, *x" says syntax error on "def foo(foo false); end" says syntax error on "def foo(foo false); end" parses "macro &*;end" parses "macro &*;end" parses "->Foo.<=(Int32)" parses "->Foo.<=(Int32)" parses "f.x %= 2" parses "f.x %= 2" says syntax error on "case 1\nin 1; 2" says syntax error on "case 1\nin 1; 2" parses "x[{1}]" parses "x[{1}]" says syntax error on "b? = 1" says syntax error on "b? = 1" parses "1 * 2" parses "1 * 2" parses "Foo::Bar?" parses "Foo::Bar?" parses "def !~(); end" parses "def !~(); end" parses "case : Int32" parses "case : Int32" parses "foo(x) do\n//\nend" parses "foo(x) do\n//\nend" parses "foo &.block[0]" parses "foo &.block[0]" parses "Foo(T)" parses "Foo(T)" says syntax error on "return | 1" says syntax error on "return | 1" parses "def foo(var : Char[256]); end" parses "def foo(var : Char[256]); end" parses "Foo(T, {x: X})" parses "Foo(T, {x: X})" parses "def []=(*args, **opts, &); end" parses "def []=(*args, **opts, &); end" parses "x.y=(1).to_s" parses "x.y=(1).to_s" says syntax error on "def self.!; end" says syntax error on "def self.!; end" says syntax error on "break < 1" says syntax error on "break < 1" parses "def self.!=; end;" parses "def self.!=; end;" says syntax error on "yield next" says syntax error on "yield next" parses "def self.^; end;" parses "def self.^; end;" parses "%q{hello \#{foo} world}" parses "%q{hello \#{foo} world}" says syntax error on "foo { |(require)| }" says syntax error on "foo { |(require)| }" parses "def foo(@lib); end" parses "def foo(@lib); end" parses "{% begin %}%Q[ %s ]{% end %}" parses "{% begin %}%Q[ %s ]{% end %}" parses "def foo; a; end" parses "def foo; a; end" parses "nil" parses "nil" says syntax error on "foo { |if| }" says syntax error on "foo { |if| }" parses "case {1}\nin {Int32.class}; 2; end" parses "case {1}\nin {Int32.class}; 2; end" parses "def |; end;" parses "def |; end;" parses "foo.|(1, 2)" parses "foo.|(1, 2)" says syntax error on "case 1\nin Int32; 2; else" says syntax error on "case 1\nin Int32; 2; else" parses "def foo(\nvar\n); end" parses "def foo(\nvar\n); end" says syntax error on "->() :Int32 { }" says syntax error on "->() :Int32 { }" says syntax error on "Foo({x: X, x: Y})" says syntax error on "Foo({x: X, x: Y})" parses "1 | 2" parses "1 | 2" parses "macro foo\n'\\''\nend" parses "macro foo\n'\\''\nend" says syntax error on "1 unless break" says syntax error on "1 unless break" parses "def foo(x @@select); end" parses "def foo(x @@select); end" parses "[] of ->\n" parses "[] of ->\n" parses "a.b +=\n1" parses "a.b +=\n1" parses "case 1\nwhen .as(T)\n2\nend" parses "case 1\nwhen .as(T)\n2\nend" parses "def []?; end" parses "def []?; end" says syntax error on "foo { |(pointerof)| }" says syntax error on "foo { |(pointerof)| }" parses "def foo(a, &block : *Int -> ); end" parses "def foo(a, &block : *Int -> ); end" parses "def foo(a, & : Int -> Double); end" parses "def foo(a, & : Int -> Double); end" says syntax error on "foo { |instance_sizeof| }" says syntax error on "foo { |instance_sizeof| }" parses "n > 2" parses "n > 2" says syntax error on "return.foo" says syntax error on "return.foo" parses "{% begin %}%w< %s >{% end %}" parses "{% begin %}%w< %s >{% end %}" parses "foo.-" parses "foo.-" parses "def >=; end;" parses "def >=; end;" parses "x[a: 1, b: 2]" parses "x[a: 1, b: 2]" parses "def foo; yield 1; yield; end" parses "def foo; yield 1; yield; end" parses "foo(z: 0, a: n // 2)" parses "foo(z: 0, a: n // 2)" says syntax error on "def self.responds_to?; end" says syntax error on "def self.responds_to?; end" says syntax error on "break[0]= 1" says syntax error on "break[0]= 1" parses "case;end" parses "case;end" parses "foo % r()" parses "foo % r()" parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo(z: 0, a: n << 2)" parses "foo(z: 0, a: n << 2)" says syntax error on "next | 1" says syntax error on "next | 1" parses "case 1; when 1; 2; else; 3; end" parses "case 1; when 1; 2; else; 3; end" parses "def >>(); end" parses "def >>(); end" says syntax error on "case 1\nwhen Int32; 2; in 2" says syntax error on "case 1\nwhen Int32; 2; in 2" parses "x = 1 rescue 2" parses "x = 1 rescue 2" says syntax error on "next == 1" says syntax error on "next == 1" parses "case 1\nin .bar?; 2; end" parses "case 1\nin .bar?; 2; end" parses "offsetof(X, @a)" parses "offsetof(X, @a)" parses "def foo(x, *y); 1; end" parses "def foo(x, *y); 1; end" parses "<<-FOO\n \t1\n \tFOO" parses "<<-FOO\n \t1\n \tFOO" parses "foo.== 1, 2" parses "foo.== 1, 2" parses "a = 1; a |= 1" parses "a = 1; a |= 1" parses "a = 1; a <<=\n1" parses "a = 1; a <<=\n1" says syntax error on ":bar foo" says syntax error on ":bar foo" parses "when : Int32" parses "when : Int32" parses "foo.bar= *baz" parses "foo.bar= *baz" parses "foo &.[0] = 1" parses "foo &.[0] = 1" parses "property module : Int32" parses "property module : Int32" parses "return : Int32" parses "return : Int32" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "foo(bar:a, baz:b)" parses "foo(bar:a, baz:b)" parses "macro %;end" parses "macro %;end" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "def *(); end;" parses "def *(); end;" parses "1..;" parses "1..;" parses ":[]=" parses ":[]=" parses "@[Foo::Bar]" parses "@[Foo::Bar]" parses "{[] of Foo, Bar::Baz.new}" parses "{[] of Foo, Bar::Baz.new}" says syntax error on "A = B = 1" says syntax error on "A = B = 1" parses "def !=; end;" parses "def !=; end;" says syntax error on "macro responds_to?; end" says syntax error on "macro responds_to?; end" parses "foo = 1; foo +1" parses "foo = 1; foo +1" parses "def foo(x = __DIR__); end" parses "def foo(x = __DIR__); end" parses "n // 2" parses "n // 2" parses "begin; / /; end" parses "begin; / /; end" parses "%r(\\/)" parses "%r(\\/)" parses "foo.is_a?(Const)" parses "foo.is_a?(Const)" parses "foo.<(1, 2)" parses "foo.<(1, 2)" parses "break {1 => 2}" parses "break {1 => 2}" says syntax error on "unless return; end" says syntax error on "unless return; end" parses "Foo(\nT,\nU,\n)" parses "Foo(\nT,\nU,\n)" parses "__DIR__" parses "__DIR__" parses "macro `;end" parses "macro `;end" says syntax error on "foo(\"bar\" \"baz\")" says syntax error on "foo(\"bar\" \"baz\")" parses "foo(z: 0, a: n + 2)" parses "foo(z: 0, a: n + 2)" says syntax error on "def foo 1; end" says syntax error on "def foo 1; end" parses "foo &.as(T).bar" parses "foo &.as(T).bar" parses "Foo(\"foo\": U, \"bar\": V)" parses "Foo(\"foo\": U, \"bar\": V)" parses "def foo(x @return); end" parses "def foo(x @return); end" parses "{% begin %}%x( %s ){% end %}" parses "{% begin %}%x( %s ){% end %}" parses "f.x <<= 2" parses "f.x <<= 2" says syntax error on "def foo\nextend\nend" says syntax error on "def foo\nextend\nend" says syntax error on "{\"\": 1}" says syntax error on "{\"\": 1}" parses "foo(0, n < 2)" parses "foo(0, n < 2)" says syntax error on "foo { |pointerof| }" says syntax error on "foo { |pointerof| }" 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 "/ hi /" parses "/ hi /" says syntax error on "def foo():String\nend" says syntax error on "def foo():String\nend" says syntax error on "def foo(x, **x); end" says syntax error on "def foo(x, **x); end" parses "as?(Bar)" parses "as?(Bar)" says syntax error on "def foo(foo struct); end" says syntax error on "def foo(foo struct); end" says syntax error on "foo { |(select)| }" says syntax error on "foo { |(select)| }" parses "!a && b" parses "!a && b" parses "qux \"foo\#{bar do end}baz\"" parses "qux \"foo\#{bar do end}baz\"" parses "def foo(x @@nil); end" parses "def foo(x @@nil); end" parses "<<-HERE\n One\n Zero\n HERE" parses "<<-HERE\n One\n Zero\n HERE" parses "1 / 2" parses "1 / 2" parses "begin : Int32" parses "begin : Int32" parses "if foo; 1; else; 2; end" parses "if foo; 1; else; 2; end" parses "foo.% 1, 2" parses "foo.% 1, 2" parses "struct Foo; end" parses "struct Foo; end" parses "{% begin %}%{ %s }{% end %}" parses "{% begin %}%{ %s }{% end %}" parses "\"foo\#{\"bar\"}baz\"" parses "\"foo\#{\"bar\"}baz\"" parses "foo(*{1})" parses "foo(*{1})" parses "foo { |(a, (b, (c, d)))| }" parses "foo { |(a, (b, (c, d)))| }" parses "property include : Int32" parses "property include : Int32" parses "(foo bar do\nend)" parses "(foo bar do\nend)" parses "def foo(return foo); end" parses "def foo(return foo); end" says syntax error on "Foo(T U)" says syntax error on "Foo(T U)" parses "a = 1; a *= 1" parses "a = 1; a *= 1" says syntax error on "def foo(*x, &x); end" says syntax error on "def foo(*x, &x); end" parses "def foo(a, &block : Int -> Double); end" parses "def foo(a, &block : Int -> Double); end" says syntax error on "def foo\ndef\nend" says syntax error on "def foo\ndef\nend" parses "1..\n2.." parses "1..\n2.." parses "+1" parses "+1" parses "foo(a: n & 2)" parses "foo(a: n & 2)" says syntax error on "def foo(foo extend); end" says syntax error on "def foo(foo extend); end" parses ":>>" parses ":>>" parses "break 1, *2" parses "break 1, *2" 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 "def foo(foo break); end" says syntax error on "def foo(foo break); end" says syntax error on "<<-'HERE\n" says syntax error on "<<-'HERE\n" parses "a\nwhile / /\n/ /\nend" parses "a\nwhile / /\n/ /\nend" parses "[1,\n 2,]" parses "[1,\n 2,]" says syntax error on "a() += 1" says syntax error on "a() += 1" parses "foo /;/" parses "foo /;/" parses "foo.[0]" parses "foo.[0]" says syntax error on "macro foo(x y z); end" says syntax error on "macro foo(x y z); end" parses "def foo(case foo); end" parses "def foo(case foo); end" parses ":\"\\u{61}\"" parses ":\"\\u{61}\"" parses "/foo/m" parses "/foo/m" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "1 ** 2" parses "1 ** 2" says syntax error on "case 1; when return; end; end" says syntax error on "case 1; when return; end; end" parses "/ /; / /" parses "/ /; / /" parses "class Foo(*T); end" parses "class Foo(*T); end" sets correct location of parameter in proc literal sets correct location of parameter in proc literal parses "macro |;end" parses "macro |;end" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "def self.|(); end;" parses "def self.|(); end;" parses ":|" parses ":|" parses "1 % 2" parses "1 % 2" parses "lib LibC; struct Foo; x : Int*; end end" parses "lib LibC; struct Foo; x : Int*; end end" parses "_, _ = 1, 2" parses "_, _ = 1, 2" says syntax error on "foo { |extend| }" says syntax error on "foo { |extend| }" parses "property with : Int32" parses "property with : Int32" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n wrong\#{1}\n HERE" parses "1 rescue 2 if 3" parses "1 rescue 2 if 3" parses "property lib : Int32" parses "property lib : Int32" parses "def foo(module foo); end" parses "def foo(module foo); end" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "{% begin %}%i( %s ){% end %}" parses "{% begin %}%i( %s ){% end %}" says syntax error on "def foo(x : U) forall; end" says syntax error on "def foo(x : U) forall; end" parses "def foo(x @@true); end" parses "def foo(x @@true); end" parses "lib LibC; {{ 1 }}; end" parses "lib LibC; {{ 1 }}; end" parses "macro foo;%var if true;end" parses "macro foo;%var if true;end" parses "foo +1" parses "foo +1" parses "def foo(x @@offsetof); end" parses "def foo(x @@offsetof); end" parses "macro foo(@[Foo] *args);end" parses "macro foo(@[Foo] *args);end" parses "foo.- 1, 2" parses "foo.- 1, 2" parses "foo(z: 0, a: n >= 2)" parses "foo(z: 0, a: n >= 2)" parses "foo.>=(1, 2)" parses "foo.>=(1, 2)" parses "def foo(enum foo); end" parses "def foo(enum foo); end" says syntax error on "a.b() += 1" says syntax error on "a.b() += 1" says syntax error on "def foo :String\nend" says syntax error on "def foo :String\nend" parses "def foo(@@pointerof); end" parses "def foo(@@pointerof); end" parses "def foo(@@next); end" parses "def foo(@@next); end" parses "class : Int32" parses "class : Int32" parses "1 ensure 2" parses "1 ensure 2" parses "foo./(1, 2)" parses "foo./(1, 2)" parses "a[0], a[1] = 1, 2" parses "a[0], a[1] = 1, 2" parses "Foo({X, Y,})" parses "Foo({X, Y,})" parses "lib Foo::Bar\nend" parses "lib Foo::Bar\nend" parses "def foo(var : self.class); end" parses "def foo(var : self.class); end" parses "def self.<(); end;" parses "def self.<(); end;" parses "a = 1; a &&= 1" parses "a = 1; a &&= 1" parses "begin; 1; rescue; 2; else; 3; end" parses "begin; 1; rescue; 2; else; 3; end" parses "Foo(x: U, y: V)" parses "Foo(x: U, y: V)" 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 "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "a = 1; a %= 1" parses "a = 1; a %= 1" says syntax error on "1 .. break" says syntax error on "1 .. break" says syntax error on "a.b {}, c = 1" says syntax error on "a.b {}, c = 1" says syntax error on "self, x = 1, 2" says syntax error on "self, x = 1, 2" says syntax error on "def foo(abstract); end" says syntax error on "def foo(abstract); end" says syntax error on "foo **bar, out x" says syntax error on "foo **bar, out x" parses "property return : Int32" parses "property return : Int32" parses "{..2}" parses "{..2}" parses "foo(0, n <= 2)" parses "foo(0, n <= 2)" parses "def foo(@module); end" parses "def foo(@module); end" parses "def foo(instance_sizeof foo); end" parses "def foo(instance_sizeof foo); end" parses "foo(z: 0, a: n - 2)" parses "foo(z: 0, a: n - 2)" parses "->@foo.foo=" parses "->@foo.foo=" parses "@foo" parses "@foo" says syntax error on "next === 1" says syntax error on "next === 1" parses "lib LibC\nfun getchar : (->)?\nend" parses "lib LibC\nfun getchar : (->)?\nend" parses "1.tap do; 1; rescue; 2; end" parses "1.tap do; 1; rescue; 2; end" parses "property when : Int32" parses "property when : Int32" parses "asm(\"nop\" ::::)" parses "asm(\"nop\" ::::)" parses "foo(0, n | 2)" parses "foo(0, n | 2)" says syntax error on "foo.&&" says syntax error on "foo.&&" parses "def foo(self foo); end" parses "def foo(self foo); end" parses "<<-HERE\n One\n \n Zero\n HERE" parses "<<-HERE\n One\n \n Zero\n HERE" parses "foo do\n//\nend" parses "foo do\n//\nend" says syntax error on "a = 1, 2, 3" says syntax error on "a = 1, 2, 3" parses "->Foo.^(Int32)" parses "->Foo.^(Int32)" parses "def foo(@@instance_sizeof); end" parses "def foo(@@instance_sizeof); end" parses "%r(\\ )" parses "%r(\\ )" parses "nil?" parses "nil?" parses "if (\ntrue\n)\n1\nend" parses "if (\ntrue\n)\n1\nend" says syntax error on "macro foo(\"\" y); end" says syntax error on "macro foo(\"\" y); end" says syntax error on "break > 1" says syntax error on "break > 1" parses "@a : Foo" parses "@a : Foo" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "def <=(*args, **opts, &); end" parses "def <=(*args, **opts, &); end" parses "x = 1; ->{ x }" parses "x = 1; ->{ x }" parses "break 1" parses "break 1" parses "foo./(1, 2) { 3 }" parses "foo./(1, 2) { 3 }" parses "foo % i()" parses "foo % i()" parses "return 1" parses "return 1" says syntax error on "case 1\nin _;" says syntax error on "case 1\nin _;" says syntax error on "def foo(begin); end" says syntax error on "def foo(begin); end" parses "1 << 2" parses "1 << 2" parses "@a : Foo = 1" parses "@a : Foo = 1" says syntax error on "case 1\nin .nil?; 2" says syntax error on "case 1\nin .nil?; 2" says syntax error on "a = 1; b = 2; a, b += 1, 2" says syntax error on "a = 1; b = 2; a, b += 1, 2" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" parses "{% unless 1; 2; end %}" parses "{% unless 1; 2; end %}" parses "f.x &-= 2" parses "f.x &-= 2" parses "def +(); end" parses "def +(); end" says syntax error on "def foo(case); end" says syntax error on "def foo(case); 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 "property elsif : Int32" parses "property elsif : Int32" says syntax error on "select\nwhen 1\n2\nend" says syntax error on "select\nwhen 1\n2\nend" parses "def foo(x @@end); end" parses "def foo(x @@end); end" parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "macro ===;end" parses "macro ===;end" parses "1 \\\r\n + 2" parses "1 \\\r\n + 2" parses "def foo; a = 1; a; end" parses "def foo; a = 1; a; end" parses "def ==(); end;" parses "def ==(); end;" says syntax error on "def foo(foo include); end" says syntax error on "def foo(foo include); end" parses "@[Foo(1, foo: 2)]" parses "@[Foo(1, foo: 2)]" parses "def foo(**args)\nargs\nend" parses "def foo(**args)\nargs\nend" parses "-> do; 1; rescue; 2; end" parses "-> do; 1; rescue; 2; end" parses "Foo({->})" parses "Foo({->})" parses "offsetof : Int32" parses "offsetof : Int32" parses "x[0] ? 1 : 0" parses "x[0] ? 1 : 0" parses "fun : Int32" parses "fun : Int32" parses "include Foo\nif true; end" parses "include Foo\nif true; end" parses "def foo(x : U) forall T, U; end" parses "def foo(x : U) forall T, U; end" parses "<<-'EOF'.x\n foo\nEOF" parses "<<-'EOF'.x\n foo\nEOF" parses "def foo(@@private); end" parses "def foo(@@private); end" says syntax error on "return &* 1" says syntax error on "return &* 1" says syntax error on "def foo(extend); end" says syntax error on "def foo(extend); end" parses "asm(\"nop\" : : )" parses "asm(\"nop\" : : )" parses "{% if 1\n x\nend %}" parses "{% if 1\n x\nend %}" parses "yield 1 if true" parses "yield 1 if true" says syntax error on "foo { |(x, x)| }" says syntax error on "foo { |(x, x)| }" single splats inside container literals 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, 3, *4, 5}" parses "{1, *2, 3, *4, 5}" parses "Set {*1, 2, *3}" parses "Set {*1, 2, *3}" parses "{*1, *2}" parses "{*1, *2}" says syntax error on "{1 => 2, *3}" says syntax error on "{1 => 2, *3}" parses "[*1, *2]" parses "[*1, *2]" parses "{1, *2}" parses "{1, *2}" parses "[1, *2, 3, *4, 5]" parses "[1, *2, 3, *4, 5]" says syntax error on "{*a: 1}" says syntax error on "{*a: 1}" says syntax error on "{*1 => 2}" says syntax error on "{*1 => 2}" parses "case 1\nwhen {*2}; 3; end" parses "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}" parses "Set {*{1} * 2}" parses "[*1, 2]" parses "[*1, 2]" 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]" parses "{*1}" parses "{*1}" parses "{*1 * 2}" parses "{*1 * 2}" parses "[1, *2]" parses "[1, *2]" parses "{a: 1, b: 2}" parses "{a: 1, b: 2}" parses "def foo(@struct); end" parses "def foo(@struct); end" says syntax error on "next / 1" says syntax error on "next / 1" parses "foo.!" parses "foo.!" parses "{% begin %}%Q{ %s }{% end %}" parses "{% begin %}%Q{ %s }{% end %}" parses "foo(0, n * 2)" parses "foo(0, n * 2)" parses "foo(n << 2)" parses "foo(n << 2)" parses "foo.<= do end" parses "foo.<= do end" says syntax error on "macro foo&&;end" says syntax error on "macro foo&&;end" parses "foo = 1; ->foo.<(Int32)" parses "foo = 1; ->foo.<(Int32)" parses "def /; end;" parses "def /; end;" says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" says syntax error on "def foo(\"bar \#{1} qux\" y); y; end" says syntax error on "foo { |(sizeof)| }" says syntax error on "foo { |(sizeof)| }" parses "lib LibC; type A = B.class; end" parses "lib LibC; type A = B.class; end" says syntax error on "def foo(true); end" says syntax error on "def foo(true); end" parses "foo(a: n + 2)" parses "foo(a: n + 2)" parses "def self.**; end;" parses "def self.**; end;" parses "macro >>;end" parses "macro >>;end" parses "def <=(other, file = 1); end" parses "def <=(other, file = 1); end" parses "-1.0" parses "-1.0" says syntax error on "def foo(x y, x z); end" says syntax error on "def foo(x y, x z); end" parses "a = 1; a |=\n1" parses "a = 1; a |=\n1" parses "def ===(); end" parses "def ===(); end" says syntax error on "next <= 1" says syntax error on "next <= 1" parses "macro foo(\na = 0\n)\nend" parses "macro foo(\na = 0\n)\nend" parses "Foo(X: U, Y: V)" parses "Foo(X: U, Y: V)" says syntax error on "A = foo(B = 1)" says syntax error on "A = foo(B = 1)" parses "foo(/a/)" parses "foo(/a/)" parses "puts %w{one two}" parses "puts %w{one two}" parses "2**3**4" parses "2**3**4" sets correct location of annotation on method parameter sets correct location of annotation on method parameter parses "foo { |a, b, | 1 }" parses "foo { |a, b, | 1 }" parses "foo(z: 0, a: n === 2)" parses "foo(z: 0, a: n === 2)" says syntax error on "def foo(foo private); end" says syntax error on "def foo(foo private); end" parses "x[1, ..2]" parses "x[1, ..2]" says syntax error on "foo { |(macro)| }" says syntax error on "foo { |(macro)| }" says syntax error on "1 as? Bar" says syntax error on "1 as? Bar" says syntax error on "break * 1" says syntax error on "break * 1" says syntax error on "next < 1" says syntax error on "next < 1" parses ":foo" parses ":foo" parses "1+0" parses "1+0" parses "a = 1; a ||= 1" parses "a = 1; a ||= 1" parses "property asm : Int32" parses "property asm : Int32" says syntax error on "fun foo\nFoo = 1" says syntax error on "fun foo\nFoo = 1" parses "begin; 1; ensure; 2; end" parses "begin; 1; ensure; 2; end" parses "Foo()?" parses "Foo()?" parses "macro foo;unless %var;true;end;end" parses "macro foo;unless %var;true;end;end" parses "lib LibC; enum Foo; A = 1; B; end end" parses "lib LibC; enum Foo; A = 1; B; end end" parses "a = 1; a &=\n1" parses "a = 1; a &=\n1" parses "def >=(other, file = 1); end" parses "def >=(other, file = 1); end" parses "foo %w" parses "foo %w" parses "(a;\nb)" parses "(a;\nb)" parses "Foo(X, sizeof(Int32))" parses "Foo(X, sizeof(Int32))" parses "{{a = 1 if 2}}" parses "{{a = 1 if 2}}" parses "case 1; when 1 then 2; else; 3; end" parses "case 1; when 1 then 2; else; 3; end" parses "foo(z: 0, a: n < 2)" parses "foo(z: 0, a: n < 2)" parses "[\n1\n]" parses "[\n1\n]" parses ":/" parses ":/" parses "(1)\nif true; end" parses "(1)\nif true; end" parses "def foo(x @@class); end" parses "def foo(x @@class); end" parses "foo.-(1, 2)" parses "foo.-(1, 2)" says syntax error on "foo { |include| }" says syntax error on "foo { |include| }" parses "foo.*(1, 2) { 3 }" parses "foo.*(1, 2) { 3 }" parses "foo begin\nbar do\nend\nend" parses "foo begin\nbar do\nend\nend" parses "select\nwhen foo\n2\nend" parses "select\nwhen foo\n2\nend" sets correct location of global path in class def sets correct location of global path in class def parses "foo.*" parses "foo.*" parses "foo a, / /" parses "foo a, / /" parses "foo(out x); x" parses "foo(out x); x" parses "foo(0, n ^ 2)" parses "foo(0, n ^ 2)" says syntax error on "foo { |(a b)| }" says syntax error on "foo { |(a b)| }" parses "{\n1\n}" parses "{\n1\n}" says syntax error on "foo { |(offsetof)| }" says syntax error on "foo { |(offsetof)| }" parses "select\nwhen foo\n2\nelse\n3\nend" parses "select\nwhen foo\n2\nelse\n3\nend" parses "enum Foo::Bar; A = 1; end" parses "enum Foo::Bar; A = 1; end" parses "def foo(@@while); end" parses "def foo(@@while); end" says syntax error on "foo { |offsetof| }" says syntax error on "foo { |offsetof| }" parses "[] of ->\n1" parses "[] of ->\n1" says syntax error on "def foo(x @@x); 1; end" says syntax error on "def foo(x @@x); 1; end" parses "case {1}\nin {nil}; 2; end" parses "case {1}\nin {nil}; 2; end" parses "def foo(x @select); end" parses "def foo(x @select); end" parses "def foo(@@sizeof); end" parses "def foo(@@sizeof); end" parses "macro foo(x, *y);end" parses "macro foo(x, *y);end" says syntax error on "foo { |abstract| }" says syntax error on "foo { |abstract| }" parses "macro foo; 1 + 2; end" parses "macro foo; 1 + 2; end" parses "Foo({X: X, Y: Y})" parses "Foo({X: X, Y: Y})" parses "case 1; when 2 then /foo/; end" parses "case 1; when 2 then /foo/; end" parses "class Foo; end\nwhile true; end" parses "class Foo; end\nwhile true; end" parses "def foo(@case); end" parses "def foo(@case); end" parses "def foo(x = 1, **args)\n1\nend" parses "def foo(x = 1, **args)\n1\nend" parses "foo(a: n | 2)" parses "foo(a: n | 2)" says syntax error on "FOO, BAR = 1, 2" says syntax error on "FOO, BAR = 1, 2" says syntax error on "unless next; end" says syntax error on "unless next; end" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\"\n: \"volatile\", \"alignstack\"\n,\n\"intel\"\n)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) : \"eax\", \"ebx\"\n: \"volatile\", \"alignstack\"\n,\n\"intel\"\n)" parses "foo.[0] = 1" parses "foo.[0] = 1" parses "alias : Int32" parses "alias : Int32" parses "{% begin %}%r<\\A>{% end %}" parses "{% begin %}%r<\\A>{% end %}" parses "def self.~; end;" parses "def self.~; end;" parses "2 * 3 + 4 * 5" parses "2 * 3 + 4 * 5" parses "foo.**(1, 2) { 3 }" parses "foo.**(1, 2) { 3 }" parses "next;" parses "next;" parses "(1 ... )" parses "(1 ... )" says syntax error on "break >= 1" says syntax error on "break >= 1" parses "foo z: out x; x" parses "foo z: out x; x" parses "@foo/2" parses "@foo/2" parses "/ /" parses "/ /" parses "foo.Bar" parses "foo.Bar" parses "foo % q()" parses "foo % q()" parses "foo = 1; ->foo.+(Int32)" parses "foo = 1; ->foo.+(Int32)" says syntax error on "def foo(enum); end" says syntax error on "def foo(enum); end" parses "def foo(x @abstract); end" parses "def foo(x @abstract); 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 "macro &**;end" parses "macro &**;end" parses "begin; 1; rescue ex; 2; end" parses "begin; 1; rescue ex; 2; end" parses "macro <=;end" parses "macro <=;end" parses "*a = 1" parses "*a = 1" says syntax error on "a() = 1" says syntax error on "a() = 1" parses "def foo(x @break); end" parses "def foo(x @break); end" says syntax error on "foo { |(abstract)| }" says syntax error on "foo { |(abstract)| }" parses "a : Foo()*" parses "a : Foo()*" parses "until : Int32" parses "until : Int32" says syntax error on "def foo(lib); end" says syntax error on "def foo(lib); end" parses "foo = 1; ->foo.&-(Int32)" parses "foo = 1; ->foo.&-(Int32)" parses "1 <=> 2" parses "1 <=> 2" parses ":~" parses ":~" parses "Foo??" parses "Foo??" parses "puts __FILE__" parses "puts __FILE__" parses "->Foo.>(Int32)" parses "->Foo.>(Int32)" says syntax error on "def foo=(a = 1, b = 2); end" says syntax error on "def foo=(a = 1, b = 2); end" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" says syntax error on "def self.is_a?; end" says syntax error on "def self.is_a?; end" parses "1.foo do; 1; end" parses "1.foo do; 1; end" parses "lib LibC\nfun getchar(a : Int)\nend" parses "lib LibC\nfun getchar(a : Int)\nend" says syntax error on "def foo(in); end" says syntax error on "def foo(in); end" says syntax error on "foo(return)" says syntax error on "foo(return)" parses "f.x //= 2" parses "f.x //= 2" parses "macro foo(x)\n 1 + 2; end" parses "macro foo(x)\n 1 + 2; end" parses "def ==(other, file = 1); end" parses "def ==(other, file = 1); end" says syntax error on "def foo var\n end" says syntax error on "def foo var\n end" says syntax error on "foo(1, 2, 3 end" says syntax error on "foo(1, 2, 3 end" parses "foo(0, n // 2)" parses "foo(0, n // 2)" parses "foo.<=(1, 2)" parses "foo.<=(1, 2)" says syntax error on "[\n]" says syntax error on "[\n]" parses "foo.bar do end" parses "foo.bar do end" parses "foo.+ 1, 2" parses "foo.+ 1, 2" says syntax error on "while break; end" says syntax error on "while break; end" parses "macro foo=;end" parses "macro foo=;end" parses "property unless : Int32" parses "property unless : Int32" parses "case foo; end" parses "case foo; end" parses "def self.^(); end;" parses "def self.^(); end;" parses "def foo(**args)\n1\nend" parses "def foo(**args)\n1\nend" parses "def foo(x = 1, *y); 1; end" parses "def foo(x = 1, *y); 1; end" parses "[1, 2] of Int" parses "[1, 2] of Int" parses "foo(z: 0, a: n >> 2)" parses "foo(z: 0, a: n >> 2)" parses "1 +2" parses "1 +2" parses "case when 1\n2\nend" parses "case when 1\n2\nend" parses "foo(z: 0, a: n % 2)" parses "foo(z: 0, a: n % 2)" says syntax error on "break when true" says syntax error on "break when true" parses "macro !=;end" parses "macro !=;end" says syntax error on "return + 1" says syntax error on "return + 1" parses "def foo(@@var); end" parses "def foo(@@var); end" parses "def foo(x @enum); end" parses "def foo(x @enum); end" parses "T::U/1" parses "T::U/1" parses "{% begin %}%i{ %s }{% end %}" parses "{% begin %}%i{ %s }{% end %}" parses "f.x /= 2" parses "f.x /= 2" says syntax error on "foo { |x, x| }" says syntax error on "foo { |x, x| }" parses "alias Foo = Bar" parses "alias Foo = Bar" parses "foo.=~ do end" parses "foo.=~ do end" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "lib LibC; type A = B; end" parses "lib LibC; type A = B; end" says syntax error on "macro Foo;end" says syntax error on "macro Foo;end" says syntax error on "\"foo\" \"bar\"" says syntax error on "\"foo\" \"bar\"" parses "->() : Int32 do end" parses "->() : Int32 do end" says syntax error on "macro foo" says syntax error on "macro foo" parses "foo(\n &.block\n)" parses "foo(\n &.block\n)" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "def foo(x @@false); end" parses "def foo(x @@false); end" says syntax error on "def foo(foo until); end" says syntax error on "def foo(foo until); end" says syntax error on "until return; end" says syntax error on "until return; end" parses "&+ 1" parses "&+ 1" says syntax error on "def foo(\"bar\");end" says syntax error on "def foo(\"bar\");end" parses "a = 1; a += 1" parses "a = 1; a += 1" parses "foo(\n1)" parses "foo(\n1)" says syntax error on "def foo(typeof); end" says syntax error on "def foo(typeof); end" parses "a = 1; a -=\n1" parses "a = 1; a -=\n1" says syntax error on "case return; when 1; end; end" says syntax error on "case return; when 1; end; end" parses "begin; rescue; end" parses "begin; rescue; end" says syntax error on "@:Foo" says syntax error on "@:Foo" says syntax error on "@@foo :: Foo" says syntax error on "@@foo :: Foo" says syntax error on "until next; end" says syntax error on "until next; end" parses "def foo(x @true); end" parses "def foo(x @true); end" says syntax error on "{1, ->{ |x| x } }" says syntax error on "{1, ->{ |x| x } }" parses "1\n+2" parses "1\n+2" parses "foo 1\n" parses "foo 1\n" parses "a = 1; a *=\n1" parses "a = 1; a *=\n1" parses "{% unless 1; 2; else 3; end %}" parses "{% unless 1; 2; else 3; end %}" parses "{% begin %}%q{ %s }{% end %}" parses "{% begin %}%q{ %s }{% end %}" parses "n <= 2" parses "n <= 2" parses "foo.|" parses "foo.|" parses "{{ //.options }}" parses "{{ //.options }}" says syntax error on "return - 1" says syntax error on "return - 1" parses "protected : Int32" parses "protected : Int32" parses "def foo; yield(1); end" parses "def foo; yield(1); end" parses "macro foo;var if true;end" parses "macro foo;var if true;end" parses "{\"foo\": 1, \"bar\": 2}" parses "{\"foo\": 1, \"bar\": 2}" parses "unless foo; 1; end" parses "unless foo; 1; end" parses "1 & 2" parses "1 & 2" parses "foo(z: 0, a: n &- 2)" parses "foo(z: 0, a: n &- 2)" says syntax error on "asm(\"\" : 1)" says syntax error on "asm(\"\" : 1)" parses "b.c ||= 1" parses "b.c ||= 1" parses "Foo()" parses "Foo()" parses "foo.^(1, 2) { 3 }" parses "foo.^(1, 2) { 3 }" says syntax error on "while next; end" says syntax error on "while next; end" parses "def foo(x @protected); end" parses "def foo(x @protected); end" says syntax error on "next &** 1" says syntax error on "next &** 1" parses ":<=>" parses ":<=>" says syntax error on "-> :Int32 { }" says syntax error on "-> :Int32 { }" parses "{[] of Foo, Bar::Baz ** 2}" parses "{[] of Foo, Bar::Baz ** 2}" parses "def foo(x = __FILE__); end" parses "def foo(x = __FILE__); end" parses "Int[8]" parses "Int[8]" says syntax error on "foo { |(if)| }" says syntax error on "foo { |(if)| }" parses "1 &** 2" parses "1 &** 2" parses "n & 2" parses "n & 2" parses "1.as? Bar" parses "1.as? Bar" parses "Foo(\"foo bar\": U)" parses "Foo(\"foo bar\": U)" parses "Foo(typeof(1))" parses "Foo(typeof(1))" parses "foo(a: n ** 2)" parses "foo(a: n ** 2)" says syntax error on "def foo(while); end" says syntax error on "def foo(while); end" parses "foo(Bar) { 1 }" parses "foo(Bar) { 1 }" says syntax error on "def foo(foo lib); end" says syntax error on "def foo(foo lib); end" says syntax error on "def foo(class); end" says syntax error on "def foo(class); end" parses "def foo(x @in); end" parses "def foo(x @in); end" says syntax error on "1 as Bar" says syntax error on "1 as Bar" parses "def foo(x @@self); end" parses "def foo(x @@self); end" says syntax error on "a.b, c.d() = 1" says syntax error on "a.b, c.d() = 1" 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 "lib LibC\nfun getch = \"get.char\"\nend" parses "lib LibC\nfun getch = \"get.char\"\nend" parses "next 1" parses "next 1" parses "a.foo, *a.bar = 1" parses "a.foo, *a.bar = 1" parses "{% begin %}%i[ %s ]{% end %}" parses "{% begin %}%i[ %s ]{% end %}" says syntax error on "def foo\nmodule\nend" says syntax error on "def foo\nmodule\nend" parses "Int[]" parses "Int[]" parses "def **(); end" parses "def **(); end" says syntax error on "def foo(foo return); end" says syntax error on "def foo(foo return); end" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "def foo(foo protected); end" says syntax error on "def foo(foo protected); end" parses "foo(0, n !~ 2)" parses "foo(0, n !~ 2)" parses "1\\\n + 2" parses "1\\\n + 2" parses "def &(); end" parses "def &(); end" parses "foo(1.., 2)" parses "foo(1.., 2)" says syntax error on "macro def foo : String; 1; end" says syntax error on "macro def foo : String; 1; end" parses "foo.&" parses "foo.&" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "foo 1, **bar, &block" parses "foo 1, **bar, &block" says syntax error on "lib Foo%end" says syntax error on "lib Foo%end" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" says syntax error on "[1 1]" says syntax error on "[1 1]" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" says syntax error on "def foo(x, x); end" says syntax error on "def foo(x, x); end" parses "foo(*bar)" parses "foo(*bar)" parses "::T/1" parses "::T/1" parses "n &- 2" parses "n &- 2" parses "b.c &&= 1" parses "b.c &&= 1" parses "/foo/imximx" parses "/foo/imximx" says syntax error on "def foo(foo with); end" says syntax error on "def foo(foo with); end" parses "~ 1" parses "~ 1" parses "foo(n - 2)" parses "foo(n - 2)" parses "lib LibC\n@[Bar]; end" parses "lib LibC\n@[Bar]; end" parses "foo &.as(T)" parses "foo &.as(T)" says syntax error on "foo &.||()" says syntax error on "foo &.||()" says syntax error on "def foo(foo alias); end" says syntax error on "def foo(foo alias); end" parses "foo 1, a: 1, b: 2" parses "foo 1, a: 1, b: 2" parses "a ? 1\n : b" parses "a ? 1\n : b" parses "->Foo./(Int32)" parses "->Foo./(Int32)" parses "foo(z: 0, a: n &+ 2)" parses "foo(z: 0, a: n &+ 2)" parses "def foo(@instance_sizeof); end" parses "def foo(@instance_sizeof); end" parses "struct : Int32" parses "struct : Int32" parses "abstract def foo\n1" parses "abstract def foo\n1" says syntax error on "foo { |(out)| }" says syntax error on "foo { |(out)| }" parses "Foo(\nT\n)" parses "Foo(\nT\n)" 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 "def foo(foo yield); end" says syntax error on "def foo(foo yield); end" parses "foo%r" parses "foo%r" parses "->Foo.=~(Int32)" parses "->Foo.=~(Int32)" parses "-> : Int32 { }" parses "-> : Int32 { }" parses "a = 1; (a)/b" parses "a = 1; (a)/b" says syntax error on "foo { |(true)| }" says syntax error on "foo { |(true)| }" parses "foo[0] = 1" parses "foo[0] = 1" parses "def foo(x @@macro); end" parses "def foo(x @@macro); end" says syntax error on "Hash {foo: 1} of Int32 => Int32" says syntax error on "Hash {foo: 1} of Int32 => Int32" parses "def foo(@@out); end" parses "def foo(@@out); end" parses "1 && 2" parses "1 && 2" 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 "{1 =>\n2, 3 =>\n4}" parses "{1 =>\n2, 3 =>\n4}" parses "macro ^;end" parses "macro ^;end" says syntax error on "foo { |(false)| }" says syntax error on "foo { |(false)| }" parses "a : Foo[12]" parses "a : Foo[12]" parses "def foo(x @yield); end" parses "def foo(x @yield); end" parses "a, b = 1" parses "a, b = 1" parses "def self.=~; end;" parses "def self.=~; end;" parses "foo = 1; ->foo.foo!" parses "foo = 1; ->foo.foo!" parses "def foo(@require); end" parses "def foo(@require); end" parses "foo { a = 1 }; a" parses "foo { a = 1 }; a" parses "def *; end;" parses "def *; end;" parses "/ /\n/ /" parses "/ /\n/ /" parses "\n\n__LINE__" parses "\n\n__LINE__" parses "next *1, 2" parses "next *1, 2" says syntax error on "break[0]" says syntax error on "break[0]" parses "macro +;end" parses "macro +;end" parses "foo % x()" parses "foo % x()" parses "n % 2" parses "n % 2" says syntax error on "foo[1] = next" says syntax error on "foo[1] = next" parses "def foo(@@require); end" parses "def foo(@@require); end" says syntax error on "return[0]" says syntax error on "return[0]" parses "@@a = uninitialized Foo" parses "@@a = uninitialized Foo" parses "lib LibC; union Foo; end end" parses "lib LibC; union Foo; end end" parses "foo.as(Bar)" parses "foo.as(Bar)" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" 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.& do end" parses "foo.& do end" parses "foo = 1; ->foo.foo?" parses "foo = 1; ->foo.foo?" says syntax error on "def foo(sizeof); end" says syntax error on "def foo(sizeof); end" parses "module Foo\ndef foo; end; end" parses "module Foo\ndef foo; end; end" parses "{% begin %}%x| %s |{% end %}" parses "{% begin %}%x| %s |{% end %}" parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "lib LibC; struct Foo; {{ 1 }}; end; end" says syntax error on "break &+ 1" says syntax error on "break &+ 1" says syntax error on "*a, b, c, d, e = 1, 2" says syntax error on "*a, b, c, d, e = 1, 2" parses "foo.>=" parses "foo.>=" parses "foo = 1; ->foo.=~(Int32)" parses "foo = 1; ->foo.=~(Int32)" parses "return 1.bar do\nend" parses "return 1.bar do\nend" parses "def foo(@@until); end" parses "def foo(@@until); end" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "1 +\n2" parses "1 +\n2" parses "macro foo;unless var;true;end;end" parses "macro foo;unless var;true;end;end" says syntax error on "return[]" says syntax error on "return[]" parses "foo.responds_to? :foo" parses "foo.responds_to? :foo" parses "{% for _, x, _ in y %}body{% end %}" parses "{% for _, x, _ in y %}body{% end %}" parses "def self./; end;" parses "def self./; end;" parses "macro foo\n'\\\\'\nend" parses "macro foo\n'\\\\'\nend" parses "foo(0, n >= 2)" parses "foo(0, n >= 2)" says syntax error on "foo { |(self)| }" says syntax error on "foo { |(self)| }" parses "*a.foo, a.bar = 1" parses "*a.foo, a.bar = 1" says syntax error on "if break; end" says syntax error on "if break; end" parses "foo = 1; ->foo.<=(Int32)" parses "foo = 1; ->foo.<=(Int32)" parses "macro foo(x); 1 + 2; end" parses "macro foo(x); 1 + 2; end" parses "\"hello \"\\\n\"world\"" parses "\"hello \"\\\n\"world\"" parses "a = 1; a >>= 1" parses "a = 1; a >>= 1" parses "{A::B}" parses "{A::B}" parses "x[..2]" parses "x[..2]" says syntax error on "def as; end" says syntax error on "def as; end" parses "def foo(**args : Foo)\n1\nend" parses "def foo(**args : Foo)\n1\nend" parses "1 -2" parses "1 -2" parses "def foo(var : (Int, Float -> Double)); end" parses "def foo(var : (Int, Float -> Double)); end" parses "foo(1, **bar)" parses "foo(1, **bar)" says syntax error on "def foo(if); end" says syntax error on "def foo(if); end" parses "def []; end" parses "def []; end" parses "def self.*; end;" parses "def self.*; end;" says syntax error on "A = foo { B = 1 }" says syntax error on "A = foo { B = 1 }" says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "{1, ->do\n|x| x\end }" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "def ===(*args, **opts, &); end" parses "def ===(*args, **opts, &); end" parses "foo { |a| 1 }" parses "foo { |a| 1 }" parses "def foo(&block :\n Int ->); end" parses "def foo(&block :\n Int ->); end" parses "Foo({\"foo bar\": X})" parses "Foo({\"foo bar\": X})" 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 " says syntax error on " {1 => end" says syntax error on " {1 => end" parses "enum Foo; private def foo; 1; end; end" parses "enum Foo; private def foo; 1; end; end" parses ":%" parses ":%" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" parses "foo = 1; ->foo.foo" parses "foo = 1; ->foo.foo" parses "a = 1; a //= 1" parses "a = 1; a //= 1" says syntax error on "foo { |(in)| }" says syntax error on "foo { |(in)| }" parses "(baz; bar do\nend)" parses "(baz; bar do\nend)" parses "def `(cmd); 1; end" parses "def `(cmd); 1; end" parses "{{ foo &.nil? }}" parses "{{ foo &.nil? }}" parses "->Foo.===(Int32)" parses "->Foo.===(Int32)" says syntax error on "{\"foo\" => 1, \"bar\": 2}" says syntax error on "{\"foo\" => 1, \"bar\": 2}" parses "foo.bar(1, 2) { 3 }" parses "foo.bar(1, 2) { 3 }" parses "->Foo.!~(Int32)" parses "->Foo.!~(Int32)" says syntax error on "def foo(x x); 1; end" says syntax error on "def foo(x x); 1; end" parses "macro foo;%var{1, x} = hello;end" parses "macro foo;%var{1, x} = hello;end" parses "macro =~;end" parses "macro =~;end" parses "foo.**(1, 2)" parses "foo.**(1, 2)" parses "1.~" parses "1.~" parses "private def foo; end" parses "private def foo; end" parses "until true; end;" parses "until true; end;" parses "{% begin %}%q< %s >{% end %}" parses "{% begin %}%q< %s >{% end %}" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "foo &.block=(0)" parses "foo &.block=(0)" parses "foo do |a|; 1; end" parses "foo do |a|; 1; end" parses "def foo(@@break); end" parses "def foo(@@break); end" parses "{{ nil?(foo) }}" parses "{{ nil?(foo) }}" parses "enum Foo; macro foo;end; end" parses "enum Foo; macro foo;end; end" parses "*a, b = 1" parses "*a, b = 1" says syntax error on "Foo(T, x: U)" says syntax error on "Foo(T, x: U)" parses "abstract def foo(x) : Int32" parses "abstract def foo(x) : Int32" parses "property false : Int32" parses "property false : Int32" parses "Foo::Bar" parses "Foo::Bar" parses "def foo(fun foo); end" parses "def foo(fun foo); end" parses "asm : Int32" parses "asm : Int32" parses "foo.| 1, 2" parses "foo.| 1, 2" parses "f.x &*= 2" parses "f.x &*= 2" says syntax error on "def foo(**args, *x); end" says syntax error on "def foo(**args, *x); end" parses "a.b/2" parses "a.b/2" parses "->foo(Int32, Float64)" parses "->foo(Int32, Float64)" says syntax error on "{a: 1, b: 2 c: 3}" says syntax error on "{a: 1, b: 2 c: 3}" parses "foo(bar do\nend)" parses "foo(bar do\nend)" says syntax error on "while 1 == 1 a; end" says syntax error on "while 1 == 1 a; end" says syntax error on "/foo)/" says syntax error on "/foo)/" says syntax error on "{a: 1, \"\": 2}" says syntax error on "{a: 1, \"\": 2}" parses "1 <= 2" parses "1 <= 2" parses "def foo(@asm); end" parses "def foo(@asm); end" parses "def foo(&block : Int ->\n); end" parses "def foo(&block : Int ->\n); end" parses "true : Int32" parses "true : Int32" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "a = 1; b = 2; c = 3; a-b -c" parses "a = 1; b = 2; c = 3; a-b -c" parses "1 =~ 2" parses "1 =~ 2" says syntax error on "def foo(foo offsetof); end" says syntax error on "def foo(foo offsetof); end" parses "1.as?(\n Int32\n)" parses "1.as?(\n Int32\n)" parses "->@foo.foo" parses "->@foo.foo" parses "->Foo.*(Int32)" parses "->Foo.*(Int32)" parses "def foo(x @@break); end" parses "def foo(x @@break); end" parses "foo(n <= 2)" parses "foo(n <= 2)" says syntax error on "def as?; end" says syntax error on "def as?; end" parses "case \nwhen 1\n2\nend" parses "case \nwhen 1\n2\nend" 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, 2) { 3 }" parses "foo.+(1, 2) { 3 }" parses "class Foo\nend" parses "class Foo\nend" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "abstract class Foo; end" parses "abstract class Foo; end" says syntax error on "Foo(\"\": T)" says syntax error on "Foo(\"\": T)" parses "x = 1; foo x do\nend" parses "x = 1; foo x do\nend" parses "macro >=;end" parses "macro >=;end" parses "/\\//" parses "/\\//" parses "def foo(var : Int | Double); end" parses "def foo(var : Int | Double); end" says syntax error on "def foo *y; 1; end" says syntax error on "def foo *y; 1; end" says syntax error on "$foo :: Foo" says syntax error on "$foo :: Foo" parses "property break : Int32" parses "property break : Int32" says syntax error on "x[1:-2]" says syntax error on "x[1:-2]" 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.bar" parses "foo.bar" says syntax error on "foo { |(while)| }" says syntax error on "foo { |(while)| }" parses "def foo(x @module); end" parses "def foo(x @module); end" parses ":=~" parses ":=~" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "1 >= 2" parses "1 >= 2" parses "def : Int32" parses "def : Int32" parses "foo.< do end" parses "foo.< do 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 "def foo(@until); end" parses "def foo(@until); end" parses "foo(0, n & 2)" parses "foo(0, n & 2)" parses "macro [];end" parses "macro [];end" parses "f.x += 2" parses "f.x += 2" sets correct location of protected macro in enum sets correct location of protected macro in enum parses "foo %q" parses "foo %q" parses "typeof(1)" parses "typeof(1)" parses "def foo(@nil); end" parses "def foo(@nil); end" parses "-1" parses "-1" says syntax error on "foo { |(case)| }" says syntax error on "foo { |(case)| }" parses "x : *T -> R" parses "x : *T -> R" parses "puts {{1}}" parses "puts {{1}}" parses "begin; 1; rescue Foo; 2; end" parses "begin; 1; rescue Foo; 2; end" parses "def foo(@@module); end" parses "def foo(@@module); end" parses "\"\"" parses "\"\"" parses "a = 1; a <<= 1" parses "a = 1; a <<= 1" parses "yield foo do\nend" parses "yield foo do\nend" says syntax error on "*a == 1" says syntax error on "*a == 1" parses "1 &+ 2" parses "1 &+ 2" sets correct location of annotation in enum sets correct location of annotation in enum parses "foo &.block(1)" parses "foo &.block(1)" parses "def |(); end" parses "def |(); end" parses "sizeof(X)" parses "sizeof(X)" parses "return 1, 2" parses "return 1, 2" parses "puts %w(one two)" parses "puts %w(one two)" parses "1.responds_to?(\n :foo\n)" parses "1.responds_to?(\n :foo\n)" parses "def foo(x @@struct); end" parses "def foo(x @@struct); end" parses "with : Int32" parses "with : Int32" parses "foo.** 1, 2" parses "foo.** 1, 2" parses "foo %q()" parses "foo %q()" parses "{% begin %}%Q| %s |{% end %}" parses "{% begin %}%Q| %s |{% end %}" parses "foo(&.as(T))" parses "foo(&.as(T))" parses "foo(&.!)" parses "foo(&.!)" parses "a = 1; a /b" parses "a = 1; a /b" parses "def foo(@self); end" parses "def foo(@self); end" parses "def self.[]?; end" parses "def self.[]?; end" says syntax error on "1 unless next" says syntax error on "1 unless next" parses "case 1; when x then 2; else; 3; end" parses "case 1; when x then 2; else; 3; end" says syntax error on "def foo(out); end" says syntax error on "def foo(out); end" parses "foo result : Int32; result" parses "foo result : Int32; result" parses "a = 1; a **=\n1" parses "a = 1; a **=\n1" parses "if foo\n1\nend" parses "if foo\n1\nend" parses "->Foo.foo" parses "->Foo.foo" parses "case\nwhen true\n1\nend" parses "case\nwhen true\n1\nend" parses "x = 0; a, b = x += 1" parses "x = 0; a, b = x += 1" says syntax error on "a = break" says syntax error on "a = break" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" says syntax error on "def foo(foo end); end" says syntax error on "def foo(foo end); end" parses "do : Int32" parses "do : Int32" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" says syntax error on "(1, 2 3)" says syntax error on "(1, 2 3)" parses "a = 1; a **= 1" parses "a = 1; a **= 1" parses "def foo(a, &block : Int, Float -> Double); end" parses "def foo(a, &block : Int, Float -> Double); end" parses "1.x; foo do\nend" parses "1.x; foo do\nend" parses "foo %Q" parses "foo %Q" parses "def foo(@if); end" parses "def foo(@if); end" parses "foo.!( )" parses "foo.!( )" parses "foo % w()" parses "foo % w()" parses "foo.** do end" parses "foo.** do end" parses "def foo(typeof foo); end" parses "def foo(typeof foo); end" parses "def >(); end;" parses "def >(); end;" parses "/fo\#{1}o/" parses "/fo\#{1}o/" parses "def foo(@include); end" parses "def foo(@include); end" parses "{% begin %}%Q( %s ){% end %}" parses "{% begin %}%Q( %s ){% end %}" parses "->@@foo.foo!" parses "->@@foo.foo!" global regex match data says syntax error on "$0, a = {1, 2}" says syntax error on "$0, a = {1, 2}" parses "$~.foo" parses "$~.foo" says syntax error on "$0, $1 = [1, 2]" says syntax error on "$0, $1 = [1, 2]" says syntax error on "$0 = 1" says syntax error on "$0 = 1" parses "$?" parses "$?" parses "$~" parses "$~" says syntax error on "$2147483648" says syntax error on "$2147483648" parses "$0" parses "$0" parses "foo $1" parses "foo $1" parses "$1?" parses "$1?" parses "$~ = 1" parses "$~ = 1" parses "$? = 1" parses "$? = 1" parses "$1" parses "$1" parses "$?.foo" parses "$?.foo" says syntax error on "$99999999999999999999999?" says syntax error on "$99999999999999999999999?" parses "foo $?" parses "foo $?" parses "def =~; end" parses "def =~; end" parses "1\n-2" parses "1\n-2" parses "->::foo!" parses "->::foo!" parses "foo.<=" parses "foo.<=" parses "\"hello \"\\\r\n\"world\"" parses "\"hello \"\\\r\n\"world\"" parses "1 * -2" parses "1 * -2" parses "def >=(*args, **opts); end" parses "def >=(*args, **opts); end" parses "break *{1, 2}" parses "break *{1, 2}" parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "'a'" parses "'a'" parses "property end : Int32" parses "property end : Int32" parses "until true; 1; end;" parses "until true; 1; end;" parses "asm(\"nop\" ::: :)" parses "asm(\"nop\" ::: :)" says syntax error on "->::foo.foo" says syntax error on "->::foo.foo" says syntax error on "1 foo" says syntax error on "1 foo" says syntax error on "A = (B = 1)" says syntax error on "A = (B = 1)" says syntax error on "foo[break]" says syntax error on "foo[break]" says syntax error on "def foo(\"\" y); y; end" says syntax error on "def foo(\"\" y); y; end" parses "def foo; x { |_| 1 }; end" parses "def foo; x { |_| 1 }; end" parses "foo.[]= do end" parses "foo.[]= do end" parses "@foo = 1" parses "@foo = 1" says syntax error on "def foo(x : U) forall U,; end" says syntax error on "def foo(x : U) forall U,; end" parses "module Foo(T); end" parses "module Foo(T); end" says syntax error on "break & 1" says syntax error on "break & 1" parses "Set() {1, 2, 3}" parses "Set() {1, 2, 3}" parses "def foo(@protected); end" parses "def foo(@protected); end" parses "def &; end;" parses "def &; end;" says syntax error on "def foo(foo while); end" says syntax error on "def foo(foo while); end" parses "f.x -= 2" parses "f.x -= 2" parses "foo(z: 0, a: n &* 2)" parses "foo(z: 0, a: n &* 2)" parses "next 1 if true" parses "next 1 if true" parses "foo.-(1, 2) { 3 }" parses "foo.-(1, 2) { 3 }" says syntax error on "def foo(self); end" says syntax error on "def foo(self); end" parses "a, b, *c = 1, 2" parses "a, b, *c = 1, 2" parses "def self.+; end;" parses "def self.+; end;" says syntax error on "def foo\nfun\nend" says syntax error on "def foo\nfun\nend" parses "def foo(var : Int32 = 1); end" parses "def foo(var : Int32 = 1); end" parses "f.x = - 1" parses "f.x = - 1" parses "foo &.bar.baz" parses "foo &.bar.baz" parses "def self.!=(); end;" parses "def self.!=(); end;" parses "pointerof(\n foo\n)" parses "pointerof(\n foo\n)" says syntax error on "def self.nil?; end" says syntax error on "def self.nil?; end" parses "<<-HERE\nHERE" parses "<<-HERE\nHERE" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "lib LibC\nfun getchar : Int\nend" parses "lib LibC\nfun getchar : Int\nend" parses "/(fo\#{\"bar\"}\#{1}o)/" parses "/(fo\#{\"bar\"}\#{1}o)/" parses "def foo(x : U) forall U; end" parses "def foo(x : U) forall U; end" parses "def foo(x @@private); end" parses "def foo(x @@private); end" parses "def foo(x @next); end" parses "def foo(x @next); end" parses "def <(); end" parses "def <(); end" parses "module Foo(*T); end" parses "module Foo(*T); end" parses "foo 1" parses "foo 1" parses "class Foo(T1); end" parses "class Foo(T1); end" parses "{1.. => 2};" parses "{1.. => 2};" parses "property if : Int32" parses "property if : Int32" parses "foo = 1; ->foo.===(Int32)" parses "foo = 1; ->foo.===(Int32)" parses "sizeof(\n Int32\n)" parses "sizeof(\n Int32\n)" parses "[..2]" parses "[..2]" parses "property yield : Int32" parses "property yield : Int32" parses "def foo(x @@enum); end" parses "def foo(x @@enum); end" parses "def foo(@@alias); end" parses "def foo(@@alias); end" parses "def foo(x @@var); end" parses "def foo(x @@var); end" parses "property private : Int32" parses "property private : Int32" parses "->@@foo.foo" parses "->@@foo.foo" says syntax error on "def foo(until); end" says syntax error on "def foo(until); end" parses "case {1}\nin {true}; 2; end" parses "case {1}\nin {true}; 2; end" parses "<<-FOO\n \t 1\n \t FOO" parses "<<-FOO\n \t 1\n \t FOO" parses "def foo(@@def); end" parses "def foo(@@def); end" parses "foo 1;" parses "foo 1;" 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 "a.foo(&block)" parses "a.foo(&block)" parses ":^" parses ":^" says syntax error on "until break; end" says syntax error on "until break; end" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "def foo(foo macro); end" says syntax error on "def foo(foo macro); end" says syntax error on "foo { |(lib)| }" says syntax error on "foo { |(lib)| }" says syntax error on "def foo @var, █ end" says syntax error on "def foo @var, █ end" parses ":!=" parses ":!=" parses "def foo(@@true); end" parses "def foo(@@true); end" says syntax error on "def foo &block : Int -> Double ; end" says syntax error on "def foo &block : Int -> Double ; end" parses "1 >> 2" parses "1 >> 2" parses "foo(z: 0, a: n !~ 2)" parses "foo(z: 0, a: n !~ 2)" parses "-1_i64" parses "-1_i64" parses "def +(); end;" parses "def +(); end;" says syntax error on "def foo @@var, █ end" says syntax error on "def foo @@var, █ end" parses "a = 1\nfoo -a" parses "a = 1\nfoo -a" parses "def foo(&\n); end" parses "def foo(&\n); end" parses "+ 1" parses "+ 1" parses "case / /; when / /; / /; else; / /; end" parses "case / /; when / /; / /; else; / /; end" parses "def foo(); 1; rescue; 2; end" parses "def foo(); 1; rescue; 2; end" says syntax error on "return &- 1" says syntax error on "return &- 1" parses "def foo(extend foo); end" parses "def foo(extend foo); end" parses "foo.^ do end" parses "foo.^ do end" parses "n ^ 2" parses "n ^ 2" parses "1 ? a : b ? c : 3" parses "1 ? a : b ? c : 3" says syntax error on "yield break" says syntax error on "yield break" parses "{% begin %}%w[ %s ]{% end %}" parses "{% begin %}%w[ %s ]{% end %}" parses "def foo(nil foo); end" parses "def foo(nil foo); end" parses "@@foo/2" parses "@@foo/2" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "foo x do\n//\nend" parses "foo x do\n//\nend" parses "foo % Q()" parses "foo % Q()" parses "def foo(x, **args)\n1\nend" parses "def foo(x, **args)\n1\nend" parses "1 if /x/" parses "1 if /x/" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "asm(\"nop\" \n)" parses "asm(\"nop\" \n)" parses "foo.<" parses "foo.<" parses "def foo(x @nil); end" parses "def foo(x @nil); end" parses "def foo(@abstract); end" parses "def foo(@abstract); end" parses "{A::B => 1, C::D => 2}" parses "{A::B => 1, C::D => 2}" parses "case 1\nelse\n2\nend" parses "case 1\nelse\n2\nend" parses "[/ /, / /]" parses "[/ /, / /]" parses "extend : Int32" parses "extend : Int32" parses "a = 1; a &+= 1" parses "a = 1; a &+= 1" parses "foo /a/" parses "foo /a/" parses "def foo(x @self); end" parses "def foo(x @self); end" parses "foo.[]=" parses "foo.[]=" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "foo\n #comment\n .bar" parses "foo\n #comment\n .bar" says syntax error on "break ** 1" says syntax error on "break ** 1" parses "def foo(x @unless); end" parses "def foo(x @unless); end" parses "return *1, 2" parses "return *1, 2" parses "puts __DIR__" parses "puts __DIR__" parses "a.b &+=\n1" parses "a.b &+=\n1" says syntax error on "{1 2}" says syntax error on "{1 2}" parses "lib LibC; struct Foo; include Bar; end; end" parses "lib LibC; struct Foo; include Bar; end; end" parses "+1_i64" parses "+1_i64" parses "(bar do\nend)" parses "(bar do\nend)" parses "begin\n1\nensure\n2\nend" parses "begin\n1\nensure\n2\nend" says syntax error on "def foo?=(x); end" says syntax error on "def foo?=(x); end" parses "def foo(with foo); end" parses "def foo(with foo); end" parses "def =~(); end" parses "def =~(); end" says syntax error on "case 1\nin Int32; 2; when 2" says syntax error on "case 1\nin Int32; 2; when 2" parses "def self.%(); end;" parses "def self.%(); end;" parses "foo.%" parses "foo.%" parses "n &** 2" parses "n &** 2" parses "{% begin %}%| %s |{% end %}" parses "{% begin %}%| %s |{% end %}" parses "{% x unless 1 %}" parses "{% x unless 1 %}" parses "{% begin %}%r(\\A){% end %}" parses "{% begin %}%r(\\A){% end %}" parses "lib LibC; struct Foo; x : Int**; end end" parses "lib LibC; struct Foo; x : Int**; end end" says syntax error on "def foo!=; end" says syntax error on "def foo!=; end" says syntax error on "def foo(private); end" says syntax error on "def foo(private); end" says syntax error on "next ^ 1" says syntax error on "next ^ 1" says syntax error on "foo { |(next)| }" says syntax error on "foo { |(next)| }" says syntax error on "1 == 2, a = 4" says syntax error on "1 == 2, a = 4" parses "*a = 1, 2" parses "*a = 1, 2" parses "foo.!= 1, 2" parses "foo.!= 1, 2" parses ":&" parses ":&" parses "if foo.responds_to? :foo\nx = 1\nend" parses "if foo.responds_to? :foo\nx = 1\nend" parses "def foo(x @false); end" parses "def foo(x @false); end" parses "def foo(protected foo); end" parses "def foo(protected foo); end" parses ":\"\\\\foo\"" parses ":\"\\\\foo\"" says syntax error on "macro !;end" says syntax error on "macro !;end" says syntax error on "{\n\"foo\"\n\"bar\"\n}" says syntax error on "{\n\"foo\"\n\"bar\"\n}" parses "require : Int32" parses "require : Int32" says syntax error on "foo(break)" says syntax error on "foo(break)" parses "def foo(@@case); end" parses "def foo(@@case); end" parses "def foo(x @@next); end" parses "def foo(x @@next); end" parses "foo %Q()" parses "foo %Q()" parses "def %(); end" parses "def %(); end" says syntax error on "next.as(Int32)" says syntax error on "next.as(Int32)" parses "def foo(&block); end" parses "def foo(&block); end" parses "def foo(x @while); end" parses "def foo(x @while); end" parses "def foo(@private); end" parses "def foo(@private); end" parses "1 ? 2 : 3" parses "1 ? 2 : 3" parses "module : Int32" parses "module : Int32" parses "next 1, *2" parses "next 1, *2" says syntax error on "break.as(Int32)" says syntax error on "break.as(Int32)" parses "a = 1\nfoo - a" parses "a = 1\nfoo - a" says syntax error on "break | 1" says syntax error on "break | 1" parses "foo 1, 2" parses "foo 1, 2" parses "x[+ 1]" parses "x[+ 1]" parses "{% begin %}%q[ %s ]{% end %}" parses "{% begin %}%q[ %s ]{% end %}" parses "foo(n | 2)" parses "foo(n | 2)" parses "foo = 1; ->foo.&**(Int32)" parses "foo = 1; ->foo.&**(Int32)" says syntax error on "{foo: 1\nbar: 2}" says syntax error on "{foo: 1\nbar: 2}" parses "def &-(); end" parses "def &-(); end" says syntax error on "def responds_to?; end" says syntax error on "def responds_to?; end" parses "def foo(macro foo); end" parses "def foo(macro foo); end" parses "def foo(x @@out); end" parses "def foo(x @@out); end" parses "macro &+;end" parses "macro &+;end" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "{%\n1\n2\n3\n%}" parses "{%\n1\n2\n3\n%}" says syntax error on "foo { |(include)| }" says syntax error on "foo { |(include)| }" parses "def []=(other, file = 1); end" parses "def []=(other, file = 1); end" parses "def /(); end" parses "def /(); end" parses "%q{hello \\n world}" parses "%q{hello \\n world}" parses "case;when true;1;end" parses "case;when true;1;end" parses "class Foo(T, *U); end" parses "class Foo(T, *U); end" parses "macro //;end" parses "macro //;end" parses "break *1" parses "break *1" says syntax error on "*1, a = 2" says syntax error on "*1, a = 2" says syntax error on "break ? 1 : 2" says syntax error on "break ? 1 : 2" parses "macro foo(a, @[Foo] var);end" parses "macro foo(a, @[Foo] var);end" parses "def self.%; end;" parses "def self.%; end;" parses "{% a = 1 if 2 %}" parses "{% a = 1 if 2 %}" parses "def foo(@@begin); end" parses "def foo(@@begin); end" parses "1.0_f32" parses "1.0_f32" says syntax error on "def foo(yield); end" says syntax error on "def foo(yield); end" parses "def foo(x @with); end" parses "def foo(x @with); end" says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "foo { |while| }" says syntax error on "foo { |while| }" parses "foo = 1; ->foo.==(Int32)" parses "foo = 1; ->foo.==(Int32)" parses "lib LibC; type A = B**; end" parses "lib LibC; type A = B**; end" parses "f.x *= 2" parses "f.x *= 2" parses "def foo(@@end); end" parses "def foo(@@end); end" says syntax error on "def is_a?; end" says syntax error on "def is_a?; end" parses "Foo(X, alignof(Int32))" parses "Foo(X, alignof(Int32))" says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "<<-FOO\n1\nFOO + 2" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "def foo(x @asm); end" parses "def foo(x @asm); end" says syntax error on "x { |*a, *b| }" says syntax error on "x { |*a, *b| }" says syntax error on "macro foo;{%end};end" says syntax error on "macro foo;{%end};end" says syntax error on "foo { |alias| }" says syntax error on "foo { |alias| }" parses "lib LibC; Foo = 1; end" parses "lib LibC; Foo = 1; end" says syntax error on "a = next" says syntax error on "a = next" parses "macro >;end" parses "macro >;end" parses "{/ / => / /, / / => / /}" parses "{/ / => / /, / / => / /}" parses "case\nend" parses "case\nend" parses "a = 1; a ensure a" parses "a = 1; a ensure a" parses "def self.foo=()\n1\nend" parses "def self.foo=()\n1\nend" parses "def foo(x @extend); end" parses "def foo(x @extend); end" parses "macro []=;end" parses "macro []=;end" parses "def %(); end;" parses "def %(); end;" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "foo(0, n > 2)" parses "foo(0, n > 2)" says syntax error on "def foo; A = 1; end" says syntax error on "def foo; A = 1; end" parses "foo(a: n >> 2)" parses "foo(a: n >> 2)" parses "foo(&.is_a?(T))" parses "foo(&.is_a?(T))" parses "foo.=~(1, 2)" parses "foo.=~(1, 2)" says syntax error on "def foo(foo in); end" says syntax error on "def foo(foo in); end" parses "foo(//)" parses "foo(//)" parses ":[]" parses ":[]" says syntax error on "return ^ 1" says syntax error on "return ^ 1" says syntax error on "a = 1; a += return" says syntax error on "a = 1; a += return" parses "Foo(T)?" parses "Foo(T)?" parses "break 1 if true" parses "break 1 if true" parses "yield : Int32" parses "yield : Int32" says syntax error on "macro is_a?; end" says syntax error on "macro is_a?; end" parses "{foo:a, bar:b}" parses "{foo:a, bar:b}" parses "foo &.nil?" parses "foo &.nil?" parses "@@foo = 1" parses "@@foo = 1" parses "->foo!" parses "->foo!" parses "break if true" parses "break if true" says syntax error on "return false foo" says syntax error on "return false foo" parses "foo %i()" parses "foo %i()" parses "->Foo.[](Int32)" parses "->Foo.[](Int32)" parses "foo.>(1, 2) { 3 }" parses "foo.>(1, 2) { 3 }" parses "def foo(a, &block : Int, self -> Double); end" parses "def foo(a, &block : Int, self -> Double); end" says syntax error on "def foo(**x, &x); end" says syntax error on "def foo(**x, &x); end" says syntax error on "require 1" says syntax error on "require 1" parses "foo.*(1, 2)" parses "foo.*(1, 2)" parses "1 - 2" parses "1 - 2" parses ":>" parses ":>" parses "foo(a: n === 2)" parses "foo(a: n === 2)" says syntax error on "def foo(pointerof); end" says syntax error on "def foo(pointerof); end" parses "puts {{\n1\n}}" parses "puts {{\n1\n}}" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" says syntax error on "foo **bar, 1" says syntax error on "foo **bar, 1" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "[1] /2" parses "[1] /2" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" parses "foo[*baz] = 1" parses "foo[*baz] = 1" says syntax error on "foo x: 1, x: 1" says syntax error on "foo x: 1, x: 1" parses "def foo(a, &block); end" parses "def foo(a, &block); end" parses "macro foo;if %var;true;end;end" parses "macro foo;if %var;true;end;end" says syntax error on "foo { |true| }" says syntax error on "foo { |true| }" parses "->Foo.foo?" parses "->Foo.foo?" parses "def foo(@with); end" parses "def foo(@with); end" parses "a : Foo = 1" parses "a : Foo = 1" parses "macro **;end" parses "macro **;end" parses "1 ? a : b" parses "1 ? a : b" parses "foo.=== 1, 2" parses "foo.=== 1, 2" parses "def foo(x @@def); end" parses "def foo(x @@def); end" parses "/foo/" parses "/foo/" parses "def foo(x, **args, &block)\n1\nend" parses "def foo(x, **args, &block)\n1\nend" parses "def *(); end" parses "def *(); end" parses "abstract def foo(x)" parses "abstract def foo(x)" parses "{% begin %}%q| %s |{% end %}" parses "{% begin %}%q| %s |{% end %}" says syntax error on "a.b() = 1" says syntax error on "a.b() = 1" parses "foo.^ 1, 2" parses "foo.^ 1, 2" 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 " parses "extend self" parses "extend self" parses "require \"foo\"; [1]" parses "require \"foo\"; [1]" parses "def foo(@[Foo] outer inner); end" parses "def foo(@[Foo] outer inner); end" parses "1.nil?(\n)" parses "1.nil?(\n)" parses "foo(z: 0, a: n <= 2)" parses "foo(z: 0, a: n <= 2)" parses "foo &.block" parses "foo &.block" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" parses "def foo(@false); end" parses "def foo(@false); end" parses "def !~; end;" parses "def !~; end;" 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 "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "foo(n ^ 2)" parses "foo(n ^ 2)" says syntax error on "return ** 1" says syntax error on "return ** 1" parses "foo.bar.baz" parses "foo.bar.baz" says syntax error on "def foo(macro); end" says syntax error on "def foo(macro); end" parses "return" parses "return" parses "foo = 1; ->foo.//(Int32)" parses "foo = 1; ->foo.//(Int32)" parses "private : Int32" parses "private : Int32" parses "@@a : Foo" parses "@@a : Foo" parses "def foo(@@if); end" parses "def foo(@@if); end" parses "foo(n > 2)" parses "foo(n > 2)" parses "def &**(); end" parses "def &**(); end" parses "enum Foo; A = 1; B; end" parses "enum Foo; A = 1; B; end" parses "class Foo\ndef foo; end; end" parses "class Foo\ndef foo; end; end" parses "<<-EOF.x\n foo\nEOF" parses "<<-EOF.x\n foo\nEOF" parses "foo.&(1, 2) { 3 }" parses "foo.&(1, 2) { 3 }" says syntax error on "macro as; end" says syntax error on "macro as; end" says syntax error on "def foo(instance_sizeof); end" says syntax error on "def foo(instance_sizeof); end" parses ":&**" parses ":&**" says syntax error on "foo { |enum| }" says syntax error on "foo { |enum| }" parses "def foo; end" parses "def foo; end" parses "x = 1; foo x { }" parses "x = 1; foo x { }" parses "abstract struct Foo; end" parses "abstract struct Foo; end" says syntax error on "Foo(T, U V)" says syntax error on "Foo(T, U V)" parses "def foo; yield; end" parses "def foo; yield; end" parses "foo.&(1, 2)" parses "foo.&(1, 2)" parses "begin; 1; rescue Foo | Bar; 2; end" parses "begin; 1; rescue Foo | Bar; 2; end" parses "def foo(x @case); end" parses "def foo(x @case); end" parses "a.b &-=\n1" parses "a.b &-=\n1" says syntax error on "return > 1" says syntax error on "return > 1" parses "foo x, *bar" parses "foo x, *bar" parses "@[Foo(\"hello\")]" parses "@[Foo(\"hello\")]" parses "property instance_sizeof : Int32" parses "property instance_sizeof : Int32" parses "Foo(Bar(T | U))" parses "Foo(Bar(T | U))" parses "def foo;{{@type}};end" parses "def foo;{{@type}};end" parses "def Foo.foo\n1\nend" parses "def Foo.foo\n1\nend" parses "def self.==(); end;" parses "def self.==(); end;" parses ":foo?" parses ":foo?" says syntax error on "def foo(offsetof); end" says syntax error on "def foo(offsetof); end" parses "Foo(x: U)" parses "Foo(x: U)" says syntax error on "def foo(def); end" says syntax error on "def foo(def); end" parses "\"hello \" \\\n \"world\"" parses "\"hello \" \\\n \"world\"" parses "foo rescue 2" parses "foo rescue 2" parses "def foo(var : Int*); end" parses "def foo(var : Int*); end" parses "def foo; end; if false; 1; else; 2; end" parses "def foo; end; if false; 1; else; 2; end" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "def foo(@[Foo] @var); end" parses "def foo(@[Foo] @var); end" parses "foo(regex: //)" parses "foo(regex: //)" parses "def foo(x @@yield); end" parses "def foo(x @@yield); end" parses "def !=(*args, **opts); end" parses "def !=(*args, **opts); end" parses "+1.0" parses "+1.0" parses "(bar {})" parses "(bar {})" parses "foo %x" parses "foo %x" parses "lib LibC; fun foo : Int*; end" parses "lib LibC; fun foo : Int*; end" parses "return 1, *2" parses "return 1, *2" says syntax error on "def foo(select); end" says syntax error on "def foo(select); end" says syntax error on "break / 1" says syntax error on "break / 1" parses "A = 1" parses "A = 1" parses "def self.&; end;" parses "def self.&; end;" parses "1 + /foo/" parses "1 + /foo/" says syntax error on "def foo(foo if); end" says syntax error on "def foo(foo if); end" parses "def ==; end;" parses "def ==; end;" parses "foo.!=(1, 2) { 3 }" parses "foo.!=(1, 2) { 3 }" parses "next : Int32" parses "next : Int32" says syntax error on "macro Foo.bar;end" says syntax error on "macro Foo.bar;end" parses "->Foo.&**(Int32)" parses "->Foo.&**(Int32)" says syntax error on "def foo(foo select); end" says syntax error on "def foo(foo select); end" parses "def foo(\n&block\n); end" parses "def foo(\n&block\n); end" parses "def foo(alias foo); end" parses "def foo(alias foo); end" parses "def foo(x @@in); end" parses "def foo(x @@in); end" parses "def foo(struct foo); end" parses "def foo(struct foo); end" parses ":\"\\\"foo\\\"\"" parses ":\"\\\"foo\\\"\"" parses "macro foo;%var;end" parses "macro foo;%var;end" parses "foo = 1; ->foo.!~(Int32)" parses "foo = 1; ->foo.!~(Int32)" parses "def !=(); end;" parses "def !=(); end;" parses "macro <;end" parses "macro <;end" parses "foo { |(a, *b, c)| }" parses "foo { |(a, *b, c)| }" says syntax error on "next >> 1" says syntax error on "next >> 1" says syntax error on "case break; when 1; end; end" says syntax error on "case break; when 1; end; end" parses "->() { }" parses "->() { }" parses "puts ::foo" parses "puts ::foo" says syntax error on "{a[]: 1}" says syntax error on "{a[]: 1}" parses "foo.[]= 1, 2" parses "foo.[]= 1, 2" says syntax error on "def foo var; end" says syntax error on "def foo var; end" parses "Foo({*X, *{Y}})" parses "Foo({*X, *{Y}})" parses "def foo(@@typeof); end" parses "def foo(@@typeof); end" parses "def ==(*args, **opts); end" parses "def ==(*args, **opts); end" says syntax error on "macro foo.bar;end" says syntax error on "macro foo.bar;end" parses "foo a: 1, &block" parses "foo a: 1, &block" says syntax error on "a, b.<=" says syntax error on "a, b.<=" parses "a = 1; a &*= 1" parses "a = 1; a &*= 1" says syntax error on "foo(**bar, out x)" says syntax error on "foo(**bar, out x)" says syntax error on "def foo(end); end" says syntax error on "def foo(end); end" parses "Int[8, 4]" parses "Int[8, 4]" parses "foo(z: 0, a: n | 2)" parses "foo(z: 0, a: n | 2)" says syntax error on "def foo\nalias\nend" says syntax error on "def foo\nalias\nend" parses "n - 2" parses "n - 2" parses "{a: 1}" parses "{a: 1}" parses "{% begin %}%i| %s |{% end %}" parses "{% begin %}%i| %s |{% end %}" says syntax error on "->::@foo.foo" says syntax error on "->::@foo.foo" parses "def foo(a); a; end" parses "def foo(a); a; end" says syntax error on "def foo; require \"bar\"; end" says syntax error on "def foo; require \"bar\"; end" says syntax error on "break % 1" says syntax error on "break % 1" 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 "foo { |with| }" says syntax error on "foo { |with| }" parses "lib LibC; struct Foo; end end" parses "lib LibC; struct Foo; end end" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "property pointerof : Int32" parses "property pointerof : Int32" parses "1 == 2" parses "1 == 2" parses "Int" parses "Int" says syntax error on "case 1; when next; end; end" says syntax error on "case 1; when next; end; end" says syntax error on "foo { |break| }" says syntax error on "foo { |break| }" parses "/ /" parses "/ /" parses "def foo(x @@until); end" parses "def foo(x @@until); end" parses "a = 1; a &*=\n1" parses "a = 1; a &*=\n1" parses "def foo; / /; end" parses "def foo; / /; end" parses "foo &->bar" parses "foo &->bar" says syntax error on "yield return" says syntax error on "yield return" parses "->::Foo.foo?" parses "->::Foo.foo?" parses "property fun : Int32" parses "property fun : Int32" parses "def foo(class foo); end" parses "def foo(class foo); end" parses "def self.|; end;" parses "def self.|; end;" parses "1 rescue 2" parses "1 rescue 2" says syntax error on "next >= 1" says syntax error on "next >= 1" says syntax error on "+next" says syntax error on "+next" parses "def ^; end;" parses "def ^; end;" parses "foo.<=(1, 2) { 3 }" parses "foo.<=(1, 2) { 3 }" parses "def downto(n)\n1\nend" parses "def downto(n)\n1\nend" says syntax error on "next << 1" says syntax error on "next << 1" says syntax error on "foo { |module| }" says syntax error on "foo { |module| }" parses "def foo(def foo); end" parses "def foo(def foo); end" parses "foo(1 + 2)" parses "foo(1 + 2)" parses "def foo(@yield); end" parses "def foo(@yield); end" says syntax error on "foo[1] = return" says syntax error on "foo[1] = return" says syntax error on "A = begin; 1; ensure; B = 1; end" says syntax error on "A = begin; 1; ensure; B = 1; end" parses "1 / 2" parses "1 / 2" parses "def foo(@@struct); end" parses "def foo(@@struct); end" parses "ensure : Int32" parses "ensure : Int32" says syntax error on "foo.responds_to?" says syntax error on "foo.responds_to?" parses "puts __LINE__" parses "puts __LINE__" says syntax error on "return <= 1" says syntax error on "return <= 1" parses "foo(a: n / 2)" parses "foo(a: n / 2)" parses "a == / /" parses "a == / /" parses "def !=(other, file = 1); end" parses "def !=(other, file = 1); end" parses "->Foo.|(Int32)" parses "->Foo.|(Int32)" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "foo(z: 0, a: n ^ 2)" parses "foo(z: 0, a: n ^ 2)" parses "def foo(@@asm); end" parses "def foo(@@asm); end" parses "def foo(false foo); end" parses "def foo(false foo); end" parses "1.as?(Bar)" parses "1.as?(Bar)" parses "a.b *=\n1" parses "a.b *=\n1" parses "enum Foo; @[Bar]; end" parses "enum Foo; @[Bar]; end" parses "Foo(Bar())" parses "Foo(Bar())" says syntax error on "def foo(alias); end" says syntax error on "def foo(alias); end" parses "1/2" parses "1/2" parses "a = 1; a/b" parses "a = 1; a/b" parses "1\\\r\n + 2" parses "1\\\r\n + 2" says syntax error on "*a if true = 2" says syntax error on "*a if true = 2" parses "foo x, y do\nend" parses "foo x, y do\nend" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "def foo : Int32\n1\nend" parses "def foo : Int32\n1\nend" parses "foo %i" parses "foo %i" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "while true; end;" parses "while true; end;" parses "def foo(var : Int**); end" parses "def foo(var : Int**); end" says syntax error on "macro foo x; 1 + 2; end" says syntax error on "macro foo x; 1 + 2; end" parses "def foo(x y); y; end" parses "def foo(x y); y; end" parses "foo.>(1, 2)" parses "foo.>(1, 2)" parses "def <; end;" parses "def <; end;" parses "a : Foo()[12]" parses "a : Foo()[12]" parses "foo.bar=(*baz)" parses "foo.bar=(*baz)" parses "Foo({String, ->})" parses "Foo({String, ->})" parses "{% begin %}%i< %s >{% end %}" parses "{% begin %}%i< %s >{% end %}" parses "def foo(include foo); end" parses "def foo(include foo); end" parses "def self.<=(); end;" parses "def self.<=(); end;" parses "macro foo(a, @[Foo] &block);end" parses "macro foo(a, @[Foo] &block);end" says syntax error on "*a, 1 = 2" says syntax error on "*a, 1 = 2" says syntax error on "return * 1" says syntax error on "return * 1" parses "def foo(var : Int -> Double); end" parses "def foo(var : Int -> Double); end" parses "class Foo(Type); end" parses "class Foo(Type); end" parses "macro []?;end" parses "macro []?;end" says syntax error on "case when .foo? then 1; end" says syntax error on "case when .foo? then 1; end" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "property typeof : Int32" parses "property typeof : Int32" parses "()" parses "()" parses "->Foo.&(Int32)" parses "->Foo.&(Int32)" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "def !=(*args, **opts, &); end" parses "def !=(*args, **opts, &); end" parses "next 1, 2" parses "next 1, 2" says syntax error on "enum Foo; A B; end" says syntax error on "enum Foo; A B; end" parses "a, *b = 1" parses "a, *b = 1" parses "def foo(@@fun); end" parses "def foo(@@fun); end" parses "def foo(@class); end" parses "def foo(@class); end" parses "def foo(while foo); end" parses "def foo(while foo); end" parses "if foo; 1; elsif bar; 2; else 3; end" parses "if foo; 1; elsif bar; 2; else 3; end" says syntax error on "break &- 1" says syntax error on "break &- 1" parses "def foo(@@in); end" parses "def foo(@@in); end" parses "1" parses "1" parses "def self.[]; end" parses "def self.[]; end" says syntax error on "def self.as; end" says syntax error on "def self.as; end" parses "a() /3" parses "a() /3" parses "Foo(_)" parses "Foo(_)" parses "enum Foo : UInt16; end" parses "enum Foo : UInt16; end" parses "def foo(x, *y : Int32); 1; end" parses "def foo(x, *y : Int32); 1; end" says syntax error on "def foo(*a foo); end" says syntax error on "def foo(*a foo); end" says syntax error on "break << 1" says syntax error on "break << 1" parses "def foo(@offsetof); end" parses "def foo(@offsetof); end" parses "protected def foo; end" parses "protected def foo; end" says syntax error on "foo { |def| }" says syntax error on "foo { |def| }" parses "n * 2" parses "n * 2" parses "property nil : Int32" parses "property nil : Int32" says syntax error on "foo.||" says syntax error on "foo.||" says syntax error on "next ? 1 : 2" says syntax error on "next ? 1 : 2" parses "foo(a: n ^ 2)" parses "foo(a: n ^ 2)" parses "def foo(x @fun); end" parses "def foo(x @fun); end" parses "class Foo < Bar; end" parses "class Foo < Bar; end" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "foo%x" parses "foo%x" parses "yield;" parses "yield;" parses "a\nwhile / /; / /; end" parses "a\nwhile / /; / /; end" parses "break;" parses "break;" says syntax error on "class Foo(*T, *U); end" says syntax error on "class Foo(*T, *U); end" says syntax error on "break &** 1" says syntax error on "break &** 1" says syntax error on "1 if return" says syntax error on "1 if return" says syntax error on "x : String, a = 4" says syntax error on "x : String, a = 4" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" parses "foo a: 1, b: 2" parses "foo a: 1, b: 2" parses "def foo(x @if); end" parses "def foo(x @if); end" says syntax error on "unless break; end" says syntax error on "unless break; end" parses "foo &.as?(T)" parses "foo &.as?(T)" parses "foo(n ** 2)" parses "foo(n ** 2)" parses "1 -2_i64" parses "1 -2_i64" parses "def foo(x @pointerof); end" parses "def foo(x @pointerof); end" parses "def foo(@@with); end" parses "def foo(@@with); end" parses "foo.bar 1, 2" parses "foo.bar 1, 2" parses "<<-SOME\n Sa\n Se\n SOME" parses "<<-SOME\n Sa\n Se\n SOME" parses "lib LibC; type A = B*; end" parses "lib LibC; type A = B*; end" parses "def foo(x = / /); end" parses "def foo(x = / /); end" says syntax error on "1 .. return" says syntax error on "1 .. return" parses "a = 1; a[2] ||= 3" parses "a = 1; a[2] ||= 3" parses "if : Int32" parses "if : Int32" parses "def self.foo\n1\nend" parses "def self.foo\n1\nend" parses "`foo`" parses "`foo`" says syntax error on "class Foo(T U)" says syntax error on "class Foo(T U)" parses "def foo(x @sizeof); end" parses "def foo(x @sizeof); end" parses "1 +2_i64" parses "1 +2_i64" parses "def foo(@macro); end" parses "def foo(@macro); end" parses "n < 2" parses "n < 2" says syntax error on "def foo:String\nend" says syntax error on "def foo:String\nend" parses "macro *;end" parses "macro *;end" parses "foo ..2" parses "foo ..2" parses "...2" parses "...2" parses "return;" parses "return;" parses "begin; 1; rescue; 2; end" parses "begin; 1; rescue; 2; end" says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "case {1, 2}; when {3}; 4; end" parses "->Foo.%(Int32)" parses "->Foo.%(Int32)" parses "while true; end\nif true; end" parses "while true; end\nif true; end" parses "foo(z: 0, a: n > 2)" parses "foo(z: 0, a: n > 2)" parses "def foo(x @struct); end" parses "def foo(x @struct); end" parses "@[Foo(1, foo: 2\n)]" parses "@[Foo(1, foo: 2\n)]" says syntax error on "foo[next]" says syntax error on "foo[next]" parses "a = 1; a &= 1" parses "a = 1; a &= 1" parses "def foo(x @include); end" parses "def foo(x @include); end" parses "def foo(@@nil); end" parses "def foo(@@nil); end" parses "foo(a: 1, b: 2)" parses "foo(a: 1, b: 2)" says syntax error on "1 ... break" says syntax error on "1 ... break" parses "foo\n.bar" parses "foo\n.bar" parses ":!~" parses ":!~" parses "lib LibC\n$errno = Foo : Int32\nend" parses "lib LibC\n$errno = Foo : Int32\nend" parses "def foo(x @end); end" parses "def foo(x @end); end" parses "asm(\"nop\" : \"a\"(0))" parses "asm(\"nop\" : \"a\"(0))" parses "def ==(*args, **opts, &); end" parses "def ==(*args, **opts, &); end" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "def foo(@return); end" parses "def foo(@return); end" parses "foo(a: n &* 2)" parses "foo(a: n &* 2)" says syntax error on "a += 1" says syntax error on "a += 1" parses "def foo(@@unless); end" parses "def foo(@@unless); end" says syntax error on "macro foo(x : Int32); end" says syntax error on "macro foo(x : Int32); end" says syntax error on "def =\nend" says syntax error on "def =\nend" says syntax error on "foo { |(return)| }" says syntax error on "foo { |(return)| }" parses "{{ foo.nil?(foo) }}" parses "{{ foo.nil?(foo) }}" parses "property struct : Int32" parses "property struct : Int32" parses "1 < 2" parses "1 < 2" parses "foo.[]=(1, 2)" parses "foo.[]=(1, 2)" parses "foo ensure 2" parses "foo ensure 2" parses "instance_sizeof(X)" parses "instance_sizeof(X)" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" parses "def ~; end;" parses "def ~; end;" parses "{[] of Foo, ::Bar::Baz.new}" parses "{[] of Foo, ::Bar::Baz.new}" says syntax error on "macro foo(**x, y)" says syntax error on "macro foo(**x, y)" says syntax error on " (1, 2, 3 end" says syntax error on " (1, 2, 3 end" says syntax error on "\"\#{<<-HERE}\"\nHERE" says syntax error on "\"\#{<<-HERE}\"\nHERE" parses "x([] of Foo, Bar.new)" parses "x([] of Foo, Bar.new)" says syntax error on "foo {1, 2}" says syntax error on "foo {1, 2}" says syntax error on "1 if break" says syntax error on "1 if break" parses "a = 1; a ^=\n1" parses "a = 1; a ^=\n1" says syntax error on "foo { |(end)| }" says syntax error on "foo { |(end)| }" says syntax error on "foo { |yield| }" says syntax error on "foo { |yield| }" parses "def foo(var : self); end" parses "def foo(var : self); end" parses "1.[]=(2, 3)" parses "1.[]=(2, 3)" parses "->@foo.foo?" parses "->@foo.foo?" parses "{[] of Foo, ::foo}" parses "{[] of Foo, ::foo}" parses "{% unless 1\n x\nend %}" parses "{% unless 1\n x\nend %}" says syntax error on "return .. 1" says syntax error on "return .. 1" parses "foo%w" parses "foo%w" says syntax error on "foo { |lib| }" says syntax error on "foo { |lib| }" parses "return if true" parses "return if true" parses "yield" parses "yield" parses ":[]=" parses ":[]=" parses "->Foo.==(Int32)" parses "->Foo.==(Int32)" says syntax error on "macro foo(x, *); 1; end" says syntax error on "macro foo(x, *); 1; end" parses "1 !~ 2" parses "1 !~ 2" parses "1.as Bar" parses "1.as Bar" says syntax error on "{1, ->{ |_| x } }" says syntax error on "{1, ->{ |_| x } }" parses "foo\n\n .bar" parses "foo\n\n .bar" says syntax error on "1 .. next" says syntax error on "1 .. next" parses "if foo\n1\nelse\n2\nend" parses "if foo\n1\nelse\n2\nend" parses "elsif : Int32" parses "elsif : Int32" parses "foo.^(1, 2)" parses "foo.^(1, 2)" parses "case 1\nwhen .!()\n2\nend" parses "case 1\nwhen .!()\n2\nend" says syntax error on "next * 1" says syntax error on "next * 1" says syntax error on "return === 1" says syntax error on "return === 1" parses "def self.>=; end;" parses "def self.>=; end;" parses "puts {{**1}}" parses "puts {{**1}}" says syntax error on "1 until 3" says syntax error on "1 until 3" parses "a = 1; class Foo; @x = a; end" parses "a = 1; class Foo; @x = a; end" says syntax error on "self = 1" says syntax error on "self = 1" parses "__FILE__" parses "__FILE__" parses "->Foo.<(Int32)" parses "->Foo.<(Int32)" parses "foo(a: n % 2)" parses "foo(a: n % 2)" parses "macro <<;end" parses "macro <<;end" parses "def &*(); end" parses "def &*(); end" says syntax error on "next.foo" says syntax error on "next.foo" says syntax error on "def foo(x :Int32); end" says syntax error on "def foo(x :Int32); end" parses ":\"\"" parses ":\"\"" parses "foo(a: n &** 2)" parses "foo(a: n &** 2)" parses "->(x : Int32) { }" parses "->(x : Int32) { }" parses "pointerof : Int32" parses "pointerof : Int32" says syntax error on "$foo" says syntax error on "$foo" parses "def foo(x @@pointerof); end" parses "def foo(x @@pointerof); end" parses "foo.>= 1, 2" parses "foo.>= 1, 2" 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({x: X, y: Y})" parses "Foo({x: X, y: Y})" says syntax error on "foo { |false| }" says syntax error on "foo { |false| }" parses "property extend : Int32" parses "property extend : Int32" parses "def foo(@next); end" parses "def foo(@next); end" parses "*_ = 1, 2" parses "*_ = 1, 2" says syntax error on "a.[]() = 1" says syntax error on "a.[]() = 1" parses "foo./ 1, 2" parses "foo./ 1, 2" parses "Foo(T | U)" parses "Foo(T | U)" parses "def !~(); end;" parses "def !~(); end;" parses "def self.**(); end;" parses "def self.**(); end;" parses "def foo(@alias); end" parses "def foo(@alias); end" parses "break *1, 2" parses "break *1, 2" parses "foo(bar:\"a\", baz:\"b\")" parses "foo(bar:\"a\", baz:\"b\")" says syntax error on "1 unless return" says syntax error on "1 unless return" parses "foo.>" parses "foo.>" says syntax error on "foo.||()" says syntax error on "foo.||()" says syntax error on "foo { |class| }" says syntax error on "foo { |class| }" parses "def foo(@@macro); end" parses "def foo(@@macro); end" parses ":<" parses ":<" parses "1 if 3" parses "1 if 3" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "{\n{1}\n}" parses "{\n{1}\n}" says syntax error on "{{ {% begin %} }}" says syntax error on "{{ {% begin %} }}" parses "foo[1] /2" parses "foo[1] /2" parses "{% begin %}%w| %s |{% end %}" parses "{% begin %}%w| %s |{% end %}" parses "lib LibC; fun foo(a : Int**); end" parses "lib LibC; fun foo(a : Int**); end" parses "a @b-1\nc" parses "a @b-1\nc" parses "def <=(*args, **opts); end" parses "def <=(*args, **opts); end" parses "foo = 1; ->foo.>>(Int32)" parses "foo = 1; ->foo.>>(Int32)" parses "/foo/x" parses "/foo/x" parses "def foo(@def); end" parses "def foo(@def); end" parses "def foo(x, *, y); 1; end" parses "def foo(x, *, y); 1; end" parses "property until : Int32" parses "property until : Int32" parses "[] of ->;" parses "[] of ->;" parses "foo(x, *bar, *baz, y)" parses "foo(x, *bar, *baz, y)" parses "foo(0, n << 2)" parses "foo(0, n << 2)" parses "\"foo\"" parses "\"foo\"" parses "foo(out @x); @x" parses "foo(out @x); @x" parses "foo(**bar)" parses "foo(**bar)" parses "lib : Int32" parses "lib : Int32" parses "macro foo\neenum\nend" parses "macro foo\neenum\nend" parses "foo = 1; foo &x" parses "foo = 1; foo &x" says syntax error on "foo { |macro| }" says syntax error on "foo { |macro| }" parses "def -; end;" parses "def -; end;" 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 "{% begin %}%w( %s ){% end %}" parses "{% begin %}%w( %s ){% end %}" parses "lib LibC\nfun getchar\nend" parses "lib LibC\nfun getchar\nend" parses "def foo(var = 1); end" parses "def foo(var = 1); end" parses "call @foo.bar" parses "call @foo.bar" parses "x.foo a: 1, b: 2 " parses "x.foo a: 1, b: 2 " parses "a; unless / /; / /; else; / /; end" parses "a; unless / /; / /; else; / /; end" parses "foo(a: n &+ 2)" parses "foo(a: n &+ 2)" parses "def self.===(); end;" parses "def self.===(); end;" parses "foo &block" parses "foo &block" says syntax error on "def foo(x @x); 1; end" says syntax error on "def foo(x @x); 1; end" says syntax error on "A = begin; 1; rescue; B = 1; end" says syntax error on "A = begin; 1; rescue; B = 1; end" says syntax error on "break == 1" says syntax error on "break == 1" parses "self / number" parses "self / number" parses "def foo(bar = 1\n); 2; end" parses "def foo(bar = 1\n); 2; end" says syntax error on "class Foo; require \"bar\"; end" says syntax error on "class Foo; require \"bar\"; end" parses "foo &.+(2)" parses "foo &.+(2)" parses "def foo(x @@instance_sizeof); end" parses "def foo(x @@instance_sizeof); end" says syntax error on "while return; end" says syntax error on "while return; end" says syntax error on "foo { |begin| }" says syntax error on "foo { |begin| }" says syntax error on "def foo(foo typeof); end" says syntax error on "def foo(foo typeof); end" parses "lib LibC; fun foo : Int**; end" parses "lib LibC; fun foo : Int**; end" parses "def foo(x @@unless); end" parses "def foo(x @@unless); end" says syntax error on "def foo(_ y); y; end" says syntax error on "def foo(_ y); y; end" parses "1 -2.0" parses "1 -2.0" parses "foo.%(1, 2) { 3 }" parses "foo.%(1, 2) { 3 }" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "def ===(other, file = 1); end" parses "def ===(other, file = 1); end" parses "def foo(@in); end" parses "def foo(@in); end" parses "def foo(\"bar qux\" y); y; end" parses "def foo(\"bar qux\" y); y; end" parses "-@foo" parses "-@foo" parses "<<-HERE\nHello, mom! I am HERE.\nHER dress is beautiful.\nHE is OK.\n HERESY\nHERE" parses "<<-HERE\nHello, mom! I am HERE.\nHER dress is beautiful.\nHE is OK.\n HERESY\nHERE" parses "a.b /2/" parses "a.b /2/" parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "def <=; end;" parses "def <=; end;" parses "foo(a: n !~ 2)" parses "foo(a: n !~ 2)" says syntax error on "macro foo x\n 1 + 2; end" says syntax error on "macro foo x\n 1 + 2; end" parses "foo.===(1, 2) { 3 }" parses "foo.===(1, 2) { 3 }" parses "def foo(true foo); end" parses "def foo(true foo); end" parses "return 1 if true" parses "return 1 if true" says syntax error on "def foo(foo require); end" says syntax error on "def foo(foo require); end" parses "foo + 1" parses "foo + 1" parses "foo &.as?(T).bar" parses "foo &.as?(T).bar" parses "module Foo; end" parses "module Foo; end" says syntax error on "return.as(Int32)" says syntax error on "return.as(Int32)" parses "foo = 1; ->foo.&(Int32)" parses "foo = 1; ->foo.&(Int32)" parses "typeof(a = 1); a" parses "typeof(a = 1); a" parses "foo(Foo: 1, Bar: 2)" parses "foo(Foo: 1, Bar: 2)" parses "foo +1.0" parses "foo +1.0" parses "1 / -2" parses "1 / -2" parses "def foo(@var); end" parses "def foo(@var); end" says syntax error on "def foo\ninclude\nend" says syntax error on "def foo\ninclude\nend" parses "Foo({X, Y})" parses "Foo({X, Y})" parses "foo(z: 0, a: n ** 2)" parses "foo(z: 0, a: n ** 2)" parses "{% x if 1 %}" parses "{% x if 1 %}" parses "foo *{1}" parses "foo *{1}" parses "a = 1; a /= 1" parses "a = 1; a /= 1" says syntax error on "module Foo; require \"bar\"; end" says syntax error on "module Foo; require \"bar\"; end" says syntax error on "+return" says syntax error on "+return" parses "def &(); end;" parses "def &(); end;" says syntax error on "def foo(foo nil); end" says syntax error on "def foo(foo nil); end" parses "def foo;bar(end: 1);end" parses "def foo;bar(end: 1);end" says syntax error on "break <= 1" says syntax error on "break <= 1" parses "a : Foo" parses "a : Foo" says syntax error on "class Foo(T, T); end" says syntax error on "class Foo(T, T); end" parses "{% begin %}%[ %s ]{% end %}" parses "{% begin %}%[ %s ]{% end %}" says syntax error on "+break" says syntax error on "+break" parses "extend Foo" parses "extend Foo" parses "-> { }" parses "-> { }" parses "def foo(x @@asm); end" parses "def foo(x @@asm); end" parses "include : Int32" parses "include : Int32" parses "def foo(n); foo(n -1); end" parses "def foo(n); foo(n -1); end" parses "def foo(a, @[Foo] var); end" parses "def foo(a, @[Foo] var); end" parses "1.=~(2)" parses "1.=~(2)" says syntax error on "foo[return]" says syntax error on "foo[return]" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "foo(n * 2)" parses "foo(n * 2)" parses "%Q{hello \\n world}" parses "%Q{hello \\n world}" parses "def self.-; end;" parses "def self.-; end;" parses "pointerof(@a)" parses "pointerof(@a)" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" parses "def foo(x @begin); end" parses "def foo(x @begin); end" parses "def foo(end foo); end" parses "def foo(end foo); end" parses "def foo(@@self); end" parses "def foo(@@self); end" says syntax error on "foo { |(class)| }" says syntax error on "foo { |(class)| }" parses "f.x &+= 2" parses "f.x &+= 2" parses "foo(n &** 2)" parses "foo(n &** 2)" parses "def foo(x @@abstract); end" parses "def foo(x @@abstract); end" parses "case 1; when 0, 1; 2; else; 3; end" parses "case 1; when 0, 1; 2; else; 3; end" parses "def foo(@[Foo] **args); end" parses "def foo(@[Foo] **args); end" parses "case 1\nwhen .as?(T)\n2\nend" parses "case 1\nwhen .as?(T)\n2\nend" parses "def foo(x @alias); end" parses "def foo(x @alias); end" parses "foo %r" parses "foo %r" says syntax error on "next ... 1" says syntax error on "next ... 1" says syntax error on "return << 1" says syntax error on "return << 1" parses "is_a?(Const)" parses "is_a?(Const)" parses "%r(foo(bar))" parses "%r(foo(bar))" parses "->::Foo.foo" parses "->::Foo.foo" parses "def foo(x = __LINE__); end" parses "def foo(x = __LINE__); end" parses "foo = 1; foo {}" parses "foo = 1; foo {}" parses "x[a: 1, b: 2,]" parses "x[a: 1, b: 2,]" parses "def foo(var : Int32 -> = 1); end" parses "def foo(var : Int32 -> = 1); end" parses "{1 => 2 / 3}" parses "{1 => 2 / 3}" parses "var.@foo" parses "var.@foo" says syntax error on "def foo(x: Int32); end" says syntax error on "def foo(x: Int32); end" parses "def foo(in foo); end" parses "def foo(in foo); end" says syntax error on "foo { |nil| }" says syntax error on "foo { |nil| }" says syntax error on "return % 1" says syntax error on "return % 1" parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "lib LibC; struct Foo; x, y, z : Int; end end" parses "def foo; with a yield; end" parses "def foo; with a yield; end" parses "def foo(x : U) : Int32 forall T, U; end" parses "def foo(x : U) : Int32 forall T, U; end" parses "def foo; a = 1; with a yield a; end" parses "def foo; a = 1; with a yield a; end" parses "enum Foo; def foo; 1; end; end" parses "enum Foo; def foo; 1; end; end" parses "foo.== do end" parses "foo.== do end" parses "property begin : Int32" parses "property begin : Int32" parses "foo { |a, b| 1 }" parses "foo { |a, b| 1 }" parses "Foo(X, offsetof(Foo, @a))" parses "Foo(X, offsetof(Foo, @a))" says syntax error on "next .. 1" says syntax error on "next .. 1" sets correct location of tuple type sets correct location of tuple type parses "def foo(out foo); end" parses "def foo(out foo); end" says syntax error on "next % 1" says syntax error on "next % 1" says syntax error on "1 then" says syntax error on "1 then" parses "end : Int32" parses "end : Int32" parses "def |(); end;" parses "def |(); end;" parses "foo.% do end" parses "foo.% do end" parses "foo(n == 2)" parses "foo(n == 2)" says syntax error on "->::@@foo.foo" says syntax error on "->::@@foo.foo" says syntax error on "next > 1" says syntax error on "next > 1" parses "puts %i(one two)" parses "puts %i(one two)" parses "def self.~(); end;" parses "def self.~(); 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 "lib LibC\n$errno : B, C -> D\nend" parses "lib LibC\n$errno : B, C -> D\nend" parses "as(Bar)" parses "as(Bar)" parses "a { |x| x } / b" parses "a { |x| x } / b" parses "a = uninitialized Foo; a" parses "a = uninitialized Foo; a" parses "responds_to?(:foo)" parses "responds_to?(:foo)" says syntax error on "break.foo" says syntax error on "break.foo" parses "foo(n >> 2)" parses "foo(n >> 2)" parses "{% begin %}%r{\\A}{% end %}" parses "{% begin %}%r{\\A}{% end %}" parses "def foo(asm foo); end" parses "def foo(asm foo); end" parses "[\n1, 2]" parses "[\n1, 2]" parses "def foo(**args : **Foo)\n1\nend" parses "def foo(**args : **Foo)\n1\nend" parses "foo out x; x" parses "foo out x; x" parses "{{ 1 // 2 }}" parses "{{ 1 // 2 }}" parses "1 \\\n + 2" parses "1 \\\n + 2" parses "foo **bar" parses "foo **bar" parses "def foo(x @offsetof); end" parses "def foo(x @offsetof); end" parses "offsetof(\n Foo,\n @foo\n)" parses "offsetof(\n Foo,\n @foo\n)" parses "a = 1; a &+=\n1" parses "a = 1; a &+=\n1" parses "foo(n &- 2)" parses "foo(n &- 2)" parses "foo = 1; ->foo.&*(Int32)" parses "foo = 1; ->foo.&*(Int32)" parses "{[] of Foo, Bar::Baz * 2}" parses "{[] of Foo, Bar::Baz * 2}" says syntax error on "alias Foo?" says syntax error on "alias Foo?" says syntax error on "foo { |protected| }" says syntax error on "foo { |protected| }" parses "macro ==;end" parses "macro ==;end" says syntax error on "def foo(foo def); end" says syntax error on "def foo(foo def); end" parses "foo %x()" parses "foo %x()" parses "case 1\nwhen .foo\n2\nend" parses "case 1\nwhen .foo\n2\nend" parses "foo(a: 1\n)" parses "foo(a: 1\n)" says syntax error on "def foo(include); end" says syntax error on "def foo(include); end" parses "enum Foo; protected def foo; 1; end; end" parses "enum Foo; protected def foo; 1; end; end" parses "lib LibFoo\nend\nif true\nend" parses "lib LibFoo\nend\nif true\nend" parses ":\"\\\"foo\"" parses ":\"\\\"foo\"" parses "{% begin %}%w{ %s }{% end %}" parses "{% begin %}%w{ %s }{% end %}" parses "foo out _" parses "foo out _" sets correct location of splat in multiple assignment sets correct location of splat in multiple assignment parses "\"\#{1\n}\"" parses "\"\#{1\n}\"" parses "foo(n / 2)" parses "foo(n / 2)" parses "foo(\na: 1,\n)" parses "foo(\na: 1,\n)" says syntax error on "def foo=(**kwargs); end" says syntax error on "def foo=(**kwargs); end" parses "alignof(X)" parses "alignof(X)" parses "enum : Int32" parses "enum : Int32" parses "foo(x: result : Int32); result" parses "foo(x: result : Int32); result" parses "foo &.baz.qux do\nend" parses "foo &.baz.qux do\nend" parses "1 .. 2" parses "1 .. 2" parses "foo = 1; foo a: 1" parses "foo = 1; foo a: 1" parses "if foo; 1; end" parses "if foo; 1; end" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "macro foo;bar(end: 1);end" parses "macro foo;bar(end: 1);end" parses "def foo(a, @[Foo] &block); end" parses "def foo(a, @[Foo] &block); end" parses "a = 1; a[2] &&= 3" parses "a = 1; a[2] &&= 3" says syntax error on " [1, 2, 3 end" says syntax error on " [1, 2, 3 end" parses "foo(a: n <= 2)" parses "foo(a: n <= 2)" parses "def foo(@begin); end" parses "def foo(@begin); end" parses "foo -1.0, -2.0" parses "foo -1.0, -2.0" parses "foo.is_a? Const" parses "foo.is_a? Const" parses "def foo(var : Char[N]); end" parses "def foo(var : Char[N]); end" parses ":foo" parses ":foo" parses "def foo(@@select); end" parses "def foo(@@select); end" parses "def foo(x @@begin); end" parses "def foo(x @@begin); end" parses "foo(0, n / 2)" parses "foo(0, n / 2)" says syntax error on "'a' foo" says syntax error on "'a' foo" parses "foo(0, n &* 2)" parses "foo(0, n &* 2)" parses "foo./" parses "foo./" parses "typeof : Int32" parses "typeof : Int32" parses "{1}" parses "{1}" parses "foo.<(1, 2) { 3 }" parses "foo.<(1, 2) { 3 }" says syntax error on "foo 1," says syntax error on "foo 1," parses "def foo(x @@alias); end" parses "def foo(x @@alias); end" parses "f.x = Foo.new" parses "f.x = Foo.new" says syntax error on "if next; end" says syntax error on "if next; end" parses "def <=(); end;" parses "def <=(); end;" says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax error on "lib LibC\n$Errno : Int32\nend" parses "case 1\nin Foo(Int32); 2; end" parses "case 1\nin Foo(Int32); 2; end" parses "macro &;end" parses "macro &;end" parses "def foo(@true); end" parses "def foo(@true); end" parses "@a = uninitialized Foo" parses "@a = uninitialized Foo" parses "T/1" parses "T/1" parses "def foo; a = 1; x { a }; end" parses "def foo; a = 1; x { a }; end" parses "yield 1" parses "yield 1" parses "n === 2" parses "n === 2" parses "def foo(@select); end" parses "def foo(@select); end" parses "{1 => 2, 3 => 4}" parses "{1 => 2, 3 => 4}" parses "foo%Q" parses "foo%Q" parses "::foo" parses "::foo" says syntax error on "break - 1" says syntax error on "break - 1" parses "f.x |= 2" parses "f.x |= 2" parses "2.3_f32" parses "2.3_f32" parses "a.b <<=\n1" parses "a.b <<=\n1" 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 "select\nwhen foo\n2\nwhen bar\n4\nend" parses "select\nwhen foo\n2\nwhen bar\n4\nend" says syntax error on "class Foo(); end" says syntax error on "class Foo(); end" parses "property offsetof : Int32" parses "property offsetof : Int32" parses "foo..2" parses "foo..2" says syntax error on "def foo(foo asm); end" says syntax error on "def foo(foo asm); end" says syntax error on "def foo(**args, x); end" says syntax error on "def foo(**args, x); end" says syntax error on "foo { |(fun)| }" says syntax error on "foo { |(fun)| }" says syntax error on "break + 1" says syntax error on "break + 1" parses "->Foo.foo=" parses "->Foo.foo=" parses "%x(`which(foo)`)" parses "%x(`which(foo)`)" says syntax error on "foo { |(struct)| }" says syntax error on "foo { |(struct)| }" parses "_, *_, _, _ = 1, 2, 3" parses "_, *_, _, _ = 1, 2, 3" says syntax error on "a, B = 1, 2" says syntax error on "a, B = 1, 2" parses "break 1, 2" parses "break 1, 2" parses "foo.!~ 1, 2" parses "foo.!~ 1, 2" parses "case 1\nin true; 2; end" parses "case 1\nin true; 2; end" parses "..2" parses "..2" parses "Foo(X, instance_alignof(Int32))" parses "Foo(X, instance_alignof(Int32))" parses "def foo(lib foo); end" parses "def foo(lib foo); end" parses "def foo(@@extend); end" parses "def foo(@@extend); end" parses "a b() {}" parses "a b() {}" parses "a = 1; a //=\n1" parses "a = 1; a //=\n1" says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "foo { |(unless)| }" says syntax error on "foo { |(unless)| }" parses "1 !~ 2" parses "1 !~ 2" parses "def self.>; end;" parses "def self.>; end;" parses "a.b //=\n1" parses "a.b //=\n1" parses "foo [1]" parses "foo [1]" parses "foo = 1; ->foo.[]=(Int32)" parses "foo = 1; ->foo.[]=(Int32)" parses "foo(0, n ** 2)" parses "foo(0, n ** 2)" says syntax error on "self += 1" says syntax error on "self += 1" says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "next &- 1" says syntax error on "next &- 1" says syntax error on "1 ... return" says syntax error on "1 ... return" parses "{\n1,\n2\n}" parses "{\n1,\n2\n}" parses "Foo{\"x\" => \"y\"}" parses "Foo{\"x\" => \"y\"}" parses "->(x) { x }" parses "->(x) { x }" parses "/foo/i" parses "/foo/i" parses "a.b **=\n1" parses "a.b **=\n1" parses "foo.**" parses "foo.**" parses "2 / 3 + 4 / 5" parses "2 / 3 + 4 / 5" parses "def <=(); end" parses "def <=(); end" parses "->::foo" parses "->::foo" parses "foo(a: n - 2)" parses "foo(a: n - 2)" parses "macro foo;%var unless true;end" parses "macro foo;%var unless true;end" parses "->Foo.&*(Int32)" parses "->Foo.&*(Int32)" parses "{\"foo\": 1}" parses "{\"foo\": 1}" parses "f.x Foo.new" parses "f.x Foo.new" parses "def >; end;" parses "def >; end;" parses "property do : Int32" parses "property do : Int32" says syntax error on "false foo" says syntax error on "false foo" parses "1 &- 2" parses "1 &- 2" says syntax error on "def !; end" says syntax error on "def !; end" says syntax error on "1 while 3" says syntax error on "1 while 3" parses "&- 1" parses "&- 1" parses "->Foo.[]=(Int32)" parses "->Foo.[]=(Int32)" says syntax error on "fun Foo : Int64\nend" says syntax error on "fun Foo : Int64\nend" says syntax error on "next[]" says syntax error on "next[]" says syntax error on "->(x, y z) { }" says syntax error on "->(x, y z) { }" parses "n == 2" parses "n == 2" parses "foo = 1; ->foo.&+(Int32)" parses "foo = 1; ->foo.&+(Int32)" says syntax error on "def foo(foo module); end" says syntax error on "def foo(foo module); end" parses "n =~ 2" parses "n =~ 2" says syntax error on "@foo :: Foo" says syntax error on "@foo :: Foo" parses "a = 1; b = 2; c = 3; a-b-c" parses "a = 1; b = 2; c = 3; a-b-c" says syntax error on "next - 1" says syntax error on "next - 1" says syntax error on "a = 1, b = 2" says syntax error on "a = 1, b = 2" parses "macro foo; bar class: 1; end" parses "macro foo; bar class: 1; end" says syntax error on "break .. 1" says syntax error on "break .. 1" parses "def foo(\nvar); end" parses "def foo(\nvar); end" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" says syntax error on "def f end" says syntax error on "def f end" says syntax error on "asm(\"\" ::: \"\"(var))" says syntax error on "asm(\"\" ::: \"\"(var))" parses "macro &-;end" parses "macro &-;end" parses "def foo; x { |a| a }; end" parses "def foo; x { |a| a }; end" says syntax error on "*a, *b = 1" says syntax error on "*a, *b = 1" parses "def foo(var); end" parses "def foo(var); end" parses "->@foo.foo!" parses "->@foo.foo!" parses "Foo({\"foo\": X, \"bar\": Y})" parses "Foo({\"foo\": X, \"bar\": Y})" says syntax error on "a {} = 1" says syntax error on "a {} = 1" parses "property else : Int32" parses "property else : Int32" parses "pointerof(@a)" parses "pointerof(@a)" parses "*a, b = 1, 2, 3, 4" parses "*a, b = 1, 2, 3, 4" says syntax error on "def foo(**args = 1); end" says syntax error on "def foo(**args = 1); end" parses "foo x do\nend" parses "foo x do\nend" says syntax error on "foo { |(until)| }" says syntax error on "foo { |(until)| }" parses "foo(a: n &- 2)" parses "foo(a: n &- 2)" parses "def foo(x @var); end" parses "def foo(x @var); end" says syntax error on "foo { |select| }" says syntax error on "foo { |select| }" parses "lib LibC\nfun SomeFun\nend" parses "lib LibC\nfun SomeFun\nend" parses "property def : Int32" parses "property def : Int32" parses "a.b &*=\n1" parses "a.b &*=\n1" says syntax error on "foo[1] = break" says syntax error on "foo[1] = break" says syntax error on "@[Foo(\"\": 1)]" says syntax error on "@[Foo(\"\": 1)]" parses "def foo(x @@typeof); end" parses "def foo(x @@typeof); end" parses "1 + 2" parses "1 + 2" parses "foo(1, **bar, &block)" parses "foo(1, **bar, &block)" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "n &+ 2" parses "n &+ 2" parses "Foo(typeof(1), typeof(2))" parses "Foo(typeof(1), typeof(2))" parses "foo(..2)" parses "foo(..2)" parses "<<-FOO\n\t 1\n\t FOO" parses "<<-FOO\n\t 1\n\t FOO" parses "a, b = 1, 2" parses "a, b = 1, 2" parses "def foo(@extend); end" parses "def foo(@extend); end" says syntax error on "return &+ 1" says syntax error on "return &+ 1" parses "def foo(a, &block : self -> self); end" parses "def foo(a, &block : self -> self); end" parses "foo &.block = 0" parses "foo &.block = 0" parses "def -(); end;" parses "def -(); end;" parses "def self.<; end;" parses "def self.<; end;" parses "macro foo;var unless true;end" parses "macro foo;var unless true;end" says syntax error on "foo { |(yield)| }" says syntax error on "foo { |(yield)| }" says syntax error on "enum Foo < UInt16; end" says syntax error on "enum Foo < UInt16; end" parses "@[Foo(\n1, foo: 2\n)]" parses "@[Foo(\n1, foo: 2\n)]" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "1_u128" parses "1_u128" says syntax error on "foo { |(typeof)| }" says syntax error on "foo { |(typeof)| }" parses "a = 1; a >>=\n1" parses "a = 1; a >>=\n1" says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "->(x : Int32, x : Int32) {}" parses "def /(); end;" parses "def /(); end;" parses "2 * (3 + 4)" parses "2 * (3 + 4)" says syntax error on "foo :: Foo" says syntax error on "foo :: Foo" parses "asm(\"nop\" ::)" parses "asm(\"nop\" ::)" parses "foo(a: n // 2)" parses "foo(a: n // 2)" parses "1 === 2" parses "1 === 2" says syntax error on "def foo(*args = 1); end" says syntax error on "def foo(*args = 1); end" parses "property protected : Int32" parses "property protected : Int32" parses "foo +1_i64" parses "foo +1_i64" says syntax error on "macro foo(*x, *y); end" says syntax error on "macro foo(*x, *y); end" parses "{% for x in y %}body{% end %}" parses "{% for x in y %}body{% end %}" sets correct location of annotation in lib sets correct location of annotation in lib parses "def **; end;" parses "def **; end;" parses "instance_sizeof(\n Int32\n)" parses "instance_sizeof(\n Int32\n)" parses "def foo(@@false); end" parses "def foo(@@false); end" parses "->Foo.**(Int32)" parses "->Foo.**(Int32)" says syntax error on "def foo x y; end" says syntax error on "def foo x y; end" parses "def foo(x @private); end" parses "def foo(x @private); end" parses "{%\na = 1\n%}" parses "{%\na = 1\n%}" parses "case {1}\nin {_}; 2; end" parses "case {1}\nin {_}; 2; end" parses ":!" parses ":!" says syntax error on "case 1 == 1; when 2 a; end" says syntax error on "case 1 == 1; when 2 a; end" parses "case {1, 2}\nwhen foo\n5\nend" parses "case {1, 2}\nwhen foo\n5\nend" parses "@@foo" parses "@@foo" parses "def foo(a, &block : Foo); end" parses "def foo(a, &block : Foo); end" parses "(/ /)" parses "(/ /)" parses "->Foo.<<(Int32)" parses "->Foo.<<(Int32)" parses "def self./(); end;" parses "def self./(); end;" parses "self" parses "self" parses "foo(a: n * 2)" parses "foo(a: n * 2)" parses "def foo(x @@with); end" parses "def foo(x @@with); end" says syntax error on "def foo(with); end" says syntax error on "def foo(with); end" says syntax error on "break // 1" says syntax error on "break // 1" parses "def foo(x @@include); end" parses "def foo(x @@include); end" parses "a.b >>=\n1" parses "a.b >>=\n1" parses ":<=" parses ":<=" parses "->(x : Int32) : Int32 { }" parses "->(x : Int32) : Int32 { }" parses "macro /;end" parses "macro /;end" says syntax error on "def foo\nabstract\nend" says syntax error on "def foo\nabstract\nend" parses "->(x : Int32) { x }" parses "->(x : Int32) { x }" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "foo(0, n % 2)" parses "foo(0, n % 2)" parses "macro foo(**args)\n1\nend" parses "macro foo(**args)\n1\nend" says syntax error on "a, b, *c, d = 1, 2" says syntax error on "a, b, *c, d = 1, 2" says syntax error on "{a[0]: 1}" says syntax error on "{a[0]: 1}" parses "->Foo.+(Int32)" parses "->Foo.+(Int32)" parses "Foo(T, 1, U)" parses "Foo(T, 1, U)" parses "def foo(x @require); end" parses "def foo(x @require); end" says syntax error on "{{ {{ 1 }} }}" says syntax error on "{{ {{ 1 }} }}" parses "abstract def foo" parses "abstract def foo" parses "Foo({x: X})" parses "Foo({x: X})" parses "foo.!=(1, 2)" parses "foo.!=(1, 2)" parses "n | 2" parses "n | 2" parses "foo%q" parses "foo%q" says syntax error on "nil foo" says syntax error on "nil foo" parses "Foo(T?)" parses "Foo(T?)" says syntax error on "def foo(foo enum); end" says syntax error on "def foo(foo enum); end" parses ":\"foo\"" parses ":\"foo\"" says syntax error on "def foo(x = 1, y); end" says syntax error on "def foo(x = 1, y); end" says syntax error on "def foo(asm); end" says syntax error on "def foo(asm); end" parses "@[Foo]" parses "@[Foo]" parses "foo = 1; b = 2; foo +b" parses "foo = 1; b = 2; foo +b" parses "next if true" parses "next if true" parses "unless : Int32" parses "unless : Int32" parses "def Foo::Bar.foo\n1\nend" parses "def Foo::Bar.foo\n1\nend" parses "abstract def foo; 1" parses "abstract def foo; 1" parses "n >= 2" parses "n >= 2" parses "{%\nif 1; 2; end\n%}" parses "{%\nif 1; 2; end\n%}" parses "1_i64" parses "1_i64" says syntax error on "foo { |struct| }" says syntax error on "foo { |struct| }" says syntax error on "1 ... next" says syntax error on "1 ... next" parses "Foo(*T)" parses "Foo(*T)" parses "foo(0, n &+ 2)" parses "foo(0, n &+ 2)" says syntax error on "class Foo(T, U V)" says syntax error on "class Foo(T, U V)" parses "foo.!= do end" parses "foo.!= do end" parses "macro : Int32" parses "macro : Int32" parses "my_def def foo\nloop do\nend\nend" parses "my_def def foo\nloop do\nend\nend" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" says syntax error on "def foo(protected); end" says syntax error on "def foo(protected); end" says syntax error on "foo { |x, (x)| }" says syntax error on "foo { |x, (x)| }" parses "def foo(@@include); end" parses "def foo(@@include); end" parses "def foo(sizeof foo); end" parses "def foo(sizeof foo); end" parses "def &+(); end" parses "def &+(); end" parses "Foo(X, instance_sizeof(Int32))" parses "Foo(X, instance_sizeof(Int32))" parses "foo(n % 2)" parses "foo(n % 2)" parses "foo(bar { })" parses "foo(bar { })" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" parses "{% begin %}%r|\\A|{% end %}" parses "{% begin %}%r|\\A|{% end %}" says syntax error on "case 1; when break; end; end" says syntax error on "case 1; when break; end; end" parses "foo.> do end" parses "foo.> do end" parses "def foo(@@var = 1); 1; end" parses "def foo(@@var = 1); 1; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "{% a = 1 %}" parses "{% a = 1 %}" parses "foo.!=" parses "foo.!=" parses "next {1, 2}" parses "next {1, 2}" parses "foo.!~" parses "foo.!~" parses "def foo(@fun); end" parses "def foo(@fun); end" parses "1 == 2 == 3 == 4" parses "1 == 2 == 3 == 4" parses "a = 1; a +=\n1" parses "a = 1; a +=\n1" parses "foo(&.responds_to?(:foo))" parses "foo(&.responds_to?(:foo))" parses "/=/" parses "/=/" parses "foo.bar(1).baz" parses "foo.bar(1).baz" says syntax error on "break ... 1" says syntax error on "break ... 1" parses "foo.+ do end" parses "foo.+ do end" says syntax error on "def foo\nstruct\nend" says syntax error on "def foo\nstruct\nend" parses "foo(a: 1, &block)" parses "foo(a: 1, &block)" parses "foo = 1; ->foo.**(Int32)" parses "foo = 1; ->foo.**(Int32)" parses "def foo(&@block); end" parses "def foo(&@block); end" parses "foo.bar = {} of Int32 => Int32" parses "foo.bar = {} of Int32 => Int32" parses "return *1" parses "return *1" says syntax error on "{1 => 2 3 => 4}" says syntax error on "{1 => 2 3 => 4}" says syntax error on "foo { |(enum)| }" says syntax error on "foo { |(enum)| }" parses "def foo(var : Int?); end" parses "def foo(var : Int?); end" says syntax error on "return >> 1" says syntax error on "return >> 1" parses "Foo?" parses "Foo?" parses "foo 1, **bar" parses "foo 1, **bar" parses "case 1; end" parses "case 1; end" parses "foo(&.bar.baz)" parses "foo(&.bar.baz)" parses "def +; end;" parses "def +; end;" parses "foo.===(1, 2)" parses "foo.===(1, 2)" parses "def self.<=; end;" parses "def self.<=; end;" says syntax error on "foo { |(nil)| }" says syntax error on "foo { |(nil)| }" parses "foo.| do end" parses "foo.| do end" parses "<<-HERE\n One\n\n Zero\n HERE" parses "<<-HERE\n One\n\n Zero\n HERE" says syntax error on "foo { |sizeof| }" says syntax error on "foo { |sizeof| }" parses "->Foo.&+(Int32)" parses "->Foo.&+(Int32)" parses "foo(0, n >> 2)" parses "foo(0, n >> 2)" 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(**bar, 1)" says syntax error on "foo(**bar, 1)" parses "foo &./(1)" parses "foo &./(1)" parses "foo(\n1\n)" parses "foo(\n1\n)" parses "a, *b = 1, 2" parses "a, *b = 1, 2" parses "foo = 1; ->foo.^(Int32)" parses "foo = 1; ->foo.^(Int32)" parses "Set(Int32) {1, 2, 3}" parses "Set(Int32) {1, 2, 3}" parses "def foo(break foo); end" parses "def foo(break foo); end" parses "foo = 1; foo(+1)" parses "foo = 1; foo(+1)" says syntax error on "foo { |typeof| }" says syntax error on "foo { |typeof| }" parses "property rescue : Int32" parses "property rescue : Int32" parses "call foo : A, end : B" parses "call foo : A, end : B" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "a.b %=\n1" parses "a.b %=\n1" parses "@@a, b = 1, 2" parses "@@a, b = 1, 2" parses ":+" parses ":+" says syntax error on "def foo(foo case); end" says syntax error on "def foo(foo case); end" parses "def foo(x @@while); end" parses "def foo(x @@while); end" parses "def **(); end;" parses "def **(); end;" parses "{foo:\"a\", bar:\"b\"}" parses "{foo:\"a\", bar:\"b\"}" parses "{{ foo }}" parses "{{ foo }}" parses "Foo(T, 1)" parses "Foo(T, 1)" parses "_ = 1" parses "_ = 1" parses "->::foo=" parses "->::foo=" parses "1;-2" parses "1;-2" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" says syntax error on "def foo(struct); end" says syntax error on "def foo(struct); end" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "foo.|(1, 2) { 3 }" parses "foo.|(1, 2) { 3 }" parses "a[], a[] = 1, 2" parses "a[], a[] = 1, 2" parses "foo.==(1, 2)" parses "foo.==(1, 2)" parses "\"hello \" \\\r\n \"world\"" parses "\"hello \" \\\r\n \"world\"" parses "a.b &=\n1" parses "a.b &=\n1" parses "Foo({String, ->, ->})" parses "Foo({String, ->, ->})" says syntax error on "foo { |(module)| }" says syntax error on "foo { |(module)| }" parses "lib LibC\nend" parses "lib LibC\nend" parses "begin 1 end / 2" parses "begin 1 end / 2" says syntax error on "def foo=(&block); end" says syntax error on "def foo=(&block); end" says syntax error on "return < 1" says syntax error on "return < 1" parses "foo()" parses "foo()" parses "foo = 1; ->foo.foo=" parses "foo = 1; ->foo.foo=" parses "foo(z: 0, a: n / 2)" parses "foo(z: 0, a: n / 2)" says syntax error on "fun foo\nclass" says syntax error on "fun foo\nclass" parses "macro x\n%{}\nend" parses "macro x\n%{}\nend" parses "foo a: b(1) do\nend" parses "foo a: b(1) do\nend" says syntax error on "def foo(&a foo); end" says syntax error on "def foo(&a foo); end" says syntax error on "foo &.||" says syntax error on "foo &.||" parses "Foo(\n)" parses "Foo(\n)" parses "Foo(T, U, 1)" parses "Foo(T, U, 1)" parses "foo(n >= 2)" parses "foo(n >= 2)" parses "foo &.block[0] = 1" parses "foo &.block[0] = 1" says syntax error on "def foo=(a,b); end" says syntax error on "def foo=(a,b); end" parses "->Foo.&-(Int32)" parses "->Foo.&-(Int32)" parses "foo *bar" parses "foo *bar" says syntax error on "Foo{one: :two, three: :four}" says syntax error on "Foo{one: :two, three: :four}" parses "def self.===; end;" parses "def self.===; end;" parses "def //(); end" parses "def //(); end" parses "macro foo\n\"\\'\"\nend" parses "macro foo\n\"\\'\"\nend" parses "foo.+(1, 2)" parses "foo.+(1, 2)" says syntax error on "{1 => 2, 3 => 4 5 => 6}" says syntax error on "{1 => 2, 3 => 4 5 => 6}" parses "def foo(@enum); end" parses "def foo(@enum); end" parses "foo(a: n == 2)" parses "foo(a: n == 2)" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "foo(z: 0, a: n &** 2)" parses "foo(z: 0, a: n &** 2)" parses "begin\n/ /\nend" parses "begin\n/ /\nend" parses "def self.!~; end;" parses "def self.!~; end;" says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" parses "a : Foo | Int32" parses "a : Foo | Int32" parses "Set {1, 2, 3}" parses "Set {1, 2, 3}" says syntax error on "if 1\n foo 1,\nend" says syntax error on "if 1\n foo 1,\nend" says syntax error on "return >= 1" says syntax error on "return >= 1" says syntax error on "case next; when 1; end; end" says syntax error on "case next; when 1; end; end" says syntax error on "return[0]= 1" says syntax error on "return[0]= 1" parses "foo.& 1, 2" parses "foo.& 1, 2" says syntax error on "foo { |until| }" says syntax error on "foo { |until| }" says syntax error on "def foo(foo class); end" says syntax error on "def foo(foo class); end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "foo.nil?( )" parses "foo.nil?( )" parses "true" parses "true" parses "def foo(x @class); end" parses "def foo(x @class); end" parses "class Foo; end" parses "class Foo; end" says syntax error on "next &+ 1" says syntax error on "next &+ 1" says syntax error on "foo { |out| }" says syntax error on "foo { |out| }" 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" says syntax error on "next ** 1" says syntax error on "next ** 1" parses "def foo; yield 1; end" parses "def foo; yield 1; end" parses "n + 2" parses "n + 2" says syntax error on "macro foo(**x, **y)" says syntax error on "macro foo(**x, **y)" says syntax error on "next[0]" says syntax error on "next[0]" parses "fun foo(x : Int32) : Int64\nx\nend" parses "fun foo(x : Int32) : Int64\nx\nend" says syntax error on "foo { |self| }" says syntax error on "foo { |self| }" parses "f.x **= 2" parses "f.x **= 2" parses "foo.* 1, 2" parses "foo.* 1, 2" parses "def foo(x @macro); end" parses "def foo(x @macro); end" parses "x = 2; foo do bar x end" parses "x = 2; foo do bar x end" parses "foo = 1; ->foo.[](Int32)" parses "foo = 1; ->foo.[](Int32)" says syntax error on "break === 1" says syntax error on "break === 1" parses "x = 1; foo.bar x do\nend" parses "x = 1; foo.bar x do\nend" parses "foo out @x; @x" parses "foo out @x; @x" parses "def foo(x @@require); end" parses "def foo(x @@require); end" parses "a.b() /3" parses "a.b() /3" says syntax error on "foo { |(extend)| }" says syntax error on "foo { |(extend)| }" says syntax error on "Set {1, 2, 3} of Int32" says syntax error on "Set {1, 2, 3} of Int32" parses "def foo(select foo); end" parses "def foo(select foo); end" parses "property sizeof : Int32" parses "property sizeof : Int32" parses "case {1}\nin {Int32}; 2; end" parses "case {1}\nin {Int32}; 2; end" parses "a = b = 2" parses "a = b = 2" parses "foo.=~(1, 2) { 3 }" parses "foo.=~(1, 2) { 3 }" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "call(foo.as Bar, Baz)" parses "call(foo.as Bar, Baz)" parses "foo &.@bar" parses "foo &.@bar" parses "1.as(\n Int32\n)" parses "1.as(\n Int32\n)" says syntax error on "foo { |in| }" says syntax error on "foo { |in| }" says syntax error on "def foo=(*args); end" says syntax error on "def foo=(*args); end" says syntax error on "foo(\"\": 1)" says syntax error on "foo(\"\": 1)" says syntax error on "foo { |private| }" says syntax error on "foo { |private| }" says syntax error on "return // 1" says syntax error on "return // 1" parses "foo(n === 2)" parses "foo(n === 2)" parses "@a, b = 1, 2" parses "@a, b = 1, 2" parses "begin\n1\nend\nif true; end" parses "begin\n1\nend\nif true; end" says syntax error on "foo { |(alias)| }" says syntax error on "foo { |(alias)| }" parses "call ->foo" parses "call ->foo" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "def foo(@@lib); end" parses "def foo(@@lib); end" parses "def foo; x { |a, *b| b }; end" parses "def foo; x { |a, *b| b }; end" parses "1 unless 3" parses "1 unless 3" parses "puts {{*1}}" parses "puts {{*1}}" says syntax error on "def foo(var = x : Int); end" says syntax error on "def foo(var = x : Int); end" parses "foo(n & 2)" parses "foo(n & 2)" parses "{% begin %}%x[ %s ]{% end %}" parses "{% begin %}%x[ %s ]{% end %}" parses "macro ~;end" parses "macro ~;end" says syntax error on "a {}, b = 1" says syntax error on "a {}, b = 1" parses "a = / /" parses "a = / /" parses "return *{1, 2}" parses "return *{1, 2}" parses "- 1" parses "- 1" says syntax error on "def foo(*x, **x); end" says syntax error on "def foo(*x, **x); end" parses "abstract : Int32" parses "abstract : Int32" parses "foo.bar = (1).abs" parses "foo.bar = (1).abs" says syntax error on "def foo(false); end" says syntax error on "def foo(false); end" parses "1.0" parses "1.0" parses "macro foo(@[Foo] **args);end" parses "macro foo(@[Foo] **args);end" parses "def foo(x @out); end" parses "def foo(x @out); end" parses "sizeof : Int32" parses "sizeof : Int32" says syntax error on "def nil?; end" says syntax error on "def nil?; end" parses "a.b ^=\n1" parses "a.b ^=\n1" says syntax error on "{a: 1, a: 2}" says syntax error on "{a: 1, a: 2}" says syntax error on "break >> 1" says syntax error on "break >> 1" parses "def foo; with a yield 1; end" parses "def foo; with a yield 1; end" parses "def foo(x @@return); end" parses "def foo(x @@return); end" parses "foo (1 + 2), 3" parses "foo (1 + 2), 3" parses "def =~; end;" parses "def =~; end;" says syntax error on "def foo\nlib\nend" says syntax error on "def foo\nlib\nend" parses "break" parses "break" parses "foo(0, n &- 2)" parses "foo(0, n &- 2)" parses "a = 1; a rescue a" parses "a = 1; a rescue a" parses "foo.< 1, 2" parses "foo.< 1, 2" parses "foo[] /2" parses "foo[] /2" says syntax error on "def foo(foo next); end" says syntax error on "def foo(foo next); end" parses "f.x &= 2" parses "f.x &= 2" parses "->::Foo.foo=" parses "->::Foo.foo=" parses "{% if 1; 2; end %}" parses "{% if 1; 2; end %}" says syntax error on "unless 1 == 1 a; end" says syntax error on "unless 1 == 1 a; end" parses "@[Foo(1)]" parses "@[Foo(1)]" parses "foo !false" parses "foo !false" says syntax error on "Foo(x: T y: U)" says syntax error on "Foo(x: T y: U)" parses "r = 1; r.x += 2" parses "r = 1; r.x += 2" 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.foo=" parses "->@@foo.foo=" parses "def foo(@[Foo] var : Int32); end" parses "def foo(@[Foo] var : Int32); end" parses "case {1}\nin {.bar?}; 2; end" parses "case {1}\nin {.bar?}; 2; end" parses "foo.=== do end" parses "foo.=== do end" parses "def self.foo()\n1\nend" parses "def self.foo()\n1\nend" parses "f.x >>= 2" parses "f.x >>= 2" parses "1 &* 2" parses "1 &* 2" parses "foo { |(_, c, )| c }" parses "foo { |(_, c, )| c }" calls with blocks within index operator (#12818) parses "foo[bar { 1 }]" parses "foo[bar { 1 }]" parses "foo.[](bar { 1 })" parses "foo.[](bar { 1 })" parses "foo.[](bar do; 1; end)" parses "foo.[](bar do; 1; end)" parses "foo.[bar { 1 }]" parses "foo.[bar { 1 }]" parses "foo.[bar do; 1; end]" parses "foo.[bar do; 1; end]" parses "foo[bar do; 1; end]" parses "foo[bar do; 1; end]" parses "def foo(@@var); 1; end" parses "def foo(@@var); 1; end" 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 "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" parses "1.is_a?(\n Int32\n)" parses "1.is_a?(\n Int32\n)" parses "def ^(); end" parses "def ^(); end" parses "def foo(x, *, y, &); 1; end" parses "def foo(x, *, y, &); 1; end" parses "a.b -=\n1" parses "a.b -=\n1" says syntax error on "{a: 1 b: 2}" says syntax error on "{a: 1 b: 2}" says syntax error on "def foo(**a foo); end" says syntax error on "def foo(**a foo); end" says syntax error on "def foo(nil); end" says syntax error on "def foo(nil); end" says syntax error on "*a if true" says syntax error on "*a if true" parses "puts a if true" parses "puts a if true" parses "def foo(@end); end" parses "def foo(@end); end" parses "foo.=~" parses "foo.=~" parses "->::Foo.foo!" parses "->::Foo.foo!" parses "\"hello \\\n world\"" parses "\"hello \\\n world\"" says syntax error on "foo(1 2)" says syntax error on "foo(1 2)" parses "<<-FOO\n\t1\n\tFOO" parses "<<-FOO\n\t1\n\tFOO" parses "def =~(); end;" parses "def =~(); end;" parses "def foo(@[Foo] *args); end" parses "def foo(@[Foo] *args); end" parses "{% begin %}%x< %s >{% end %}" parses "{% begin %}%x< %s >{% end %}" parses "def foo(until foo); end" parses "def foo(until foo); end" says syntax error on "foo { |(break)| }" says syntax error on "foo { |(break)| }" parses "asm(\"nop\" :::: \"volatile\")" parses "asm(\"nop\" :::: \"volatile\")" parses "foo(a: n < 2)" parses "foo(a: n < 2)" parses "begin; 1; rescue ex; 2; end; ex" parses "begin; 1; rescue ex; 2; end; ex" parses "def foo(if foo); end" parses "def foo(if foo); end" parses "x : Foo(A, *B, C)" parses "x : Foo(A, *B, C)" end locations sets correct location for fun def with body sets correct location for fun def with body parses "%w{one\ntwo}" parses "%w{one\ntwo}" parses "%w{one{} two}" parses "%w{one{} two}" parses "%w{one\\ two}" parses "%w{one\\ two}" gets correct location after macro with yield gets correct location after macro with yield gets corrects end location for "foo ->self.bar=" gets corrects end location for "foo ->self.bar=" gets corrects end location for "macro foo;end" gets corrects end location for "macro foo;end" says syntax error on "{1, 2\n,3}" says syntax error on "{1, 2\n,3}" gets corrects end location for "foo ->bar" gets corrects end location for "foo ->bar" gets corrects end location for "foo : Foo.class" gets corrects end location for "foo : Foo.class" gets corrects end location for "x : Foo ->" gets corrects end location for "x : Foo ->" sets correct location of vars in C struct sets correct location of vars in C struct gets corrects end location for "unless 1; 2; end" gets corrects end location for "unless 1; 2; end" gets corrects end location for "Foo(A)" gets corrects end location for "Foo(A)" gets corrects end location for "!foo" gets corrects end location for "!foo" gets corrects end location for "a, b = 1, 2" gets corrects end location for "a, b = 1, 2" sets correct location and end location of parenthesized block sets correct location and end location of parenthesized block parses "annotation Foo\n\nend" parses "annotation Foo\n\nend" parses "%w{one\\}}" parses "%w{one\\}}" gets corrects end location for "abstract def foo(x)" gets corrects end location for "abstract def foo(x)" gets corrects end location for "extend Foo" gets corrects end location for "extend Foo" parses "%i(one\\ two)" parses "%i(one\\ two)" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "\"hello\"" gets corrects end location for "\"hello\"" 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 "a || b" gets corrects end location for "a || b" sets correct location of proc literal sets correct location of proc literal gets correct location with (#1558) gets correct location with (#1558) says syntax error on "def foo(x : Int32, Int32); end" says syntax error on "def foo(x : Int32, Int32); end" gets corrects end location for "yield" gets corrects end location for "yield" gets corrects end location for "nil" gets corrects end location for "nil" 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 rescue 2" gets corrects end location for "1 rescue 2" parses "%w{\n}" parses "%w{\n}" gets corrects end location for "1.." gets corrects end location for "1.." says syntax error on "%w{{one}" says syntax error on "%w{{one}" gets corrects end location for "a && b" gets corrects end location for "a && b" gets corrects end location for "{} of Int32 => String" gets corrects end location for "{} of Int32 => String" says syntax error on "case x; when {1, 2}; 2; when {1, 2}; end" says syntax error on "case x; when {1, 2}; 2; when {1, 2}; end" gets corrects end location for "foo(1, 2)" gets corrects end location for "foo(1, 2)" says syntax error on "%w(" says syntax error on "%w(" says syntax error on "Foo(X\n,Y)" says syntax error on "Foo(X\n,Y)" gets corrects end location for "foo.[0] = 1" gets corrects end location for "foo.[0] = 1" gets corrects end location for "1..3" gets corrects end location for "1..3" gets corrects end location for "foo ->bar=" gets corrects end location for "foo ->bar=" says syntax error on "macro foo(x\n,y); 1; end" says syntax error on "macro foo(x\n,y); 1; end" sets correct location of call name in operator assignment sets correct location of call name in operator assignment sets correct location of element in array literal sets correct location of element in array literal gets corrects end location for "foo *bar" gets corrects end location for "foo *bar" gets corrects end location for "foo ->self.bar" gets corrects end location for "foo ->self.bar" gets corrects end location for "Foo { 1 }" gets corrects end location for "Foo { 1 }" 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 "return 1" gets corrects end location for "return 1" gets corrects end location for "foo 1, 2" gets corrects end location for "foo 1, 2" says syntax error on "foo(1\n,2)" says syntax error on "foo(1\n,2)" 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 "x : Foo -> Bar" gets corrects end location for "x : Foo -> Bar" gets corrects end location for block with { ... } gets corrects end location for block with { ... } says syntax error on "case x; when _; end" says syntax error on "case x; when _; end" 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; when 1; end" says syntax error on "case x; when 1; 2; when 1; end" sets correct location of var in proc pointer sets correct location of var in proc pointer gets corrects end location for "begin; 1; end" gets corrects end location for "begin; 1; end" says syntax error on "%q(" says syntax error on "%q(" gets corrects end location for "module Foo; end" gets corrects end location for "module Foo; end" sets correct location of call name sets correct location of call name sets correct location of var in type declaration sets correct location of var in type declaration gets corrects end location for "macro foo; 123; end" gets corrects end location for "macro foo; 123; end" correctly computes line number after `\{% ` (#9857) correctly computes line number after `\{% ` (#9857) gets corrects end location for "->{ }" gets corrects end location for "->{ }" gets corrects end location for "if 1; elseif; 2; end" gets corrects end location for "if 1; elseif; 2; end" says syntax error on "[1\n,2]" says syntax error on "[1\n,2]" gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "Foo?" gets corrects end location for "Foo?" sets correct locations of macro if / else / elsif sets correct locations of macro if / else / elsif gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "foo.bar(x) do; end" sets correct location of `elsif` of if statement sets correct location of `elsif` of if statement says syntax error on "%w{one}}" says syntax error on "%w{one}}" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "@foo" gets corrects end location for "@foo" gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "foo ->@@bar.baz" sets correct location of receiver var in method def sets correct location of receiver var in method def gets corrects end location for "sizeof(Foo)" gets corrects end location for "sizeof(Foo)" gets corrects end location for "foo.nil?" gets corrects end location for "foo.nil?" sets correct locations of keywords of exception handler sets correct locations of keywords of exception handler says syntax error on "<<-HEREDOC\n" says syntax error on "<<-HEREDOC\n" parses "%i((one two))" parses "%i((one two))" gets corrects end location for "a = 123" gets corrects end location for "a = 123" gets corrects end location for "foo bar, out baz" gets corrects end location for "foo bar, out baz" sets correct location for fun def sets correct location for fun def sets correct location for fun def with return type sets correct location for fun def with return type sets correct location of `else` of unless statement sets correct location of `else` of unless statement gets corrects end location for "pointerof(@foo)" gets corrects end location for "pointerof(@foo)" says syntax error on "case x; when X; 2; when X; end" says syntax error on "case x; when X; 2; when X; end" gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "x : Foo(A, *B, C)" says syntax error on "def foo(x : *Int32); end" says syntax error on "def foo(x : *Int32); end" sets location of obj.x += as call sets location of obj.x += as call gets corrects end location for "abstract def foo" gets corrects end location for "abstract def foo" gets corrects end location for "1.as(Int32)" gets corrects end location for "1.as(Int32)" gets corrects end location for "f.x = foo" gets corrects end location for "f.x = foo" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "foo : Foo[42]" gets corrects end location for "foo : Foo[42]" gets corrects end location for "@@foo" gets corrects end location for "@@foo" 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 "%i{{one}" says syntax error on "%i{{one}" gets corrects end location for "foo : Foo?" gets corrects end location for "foo : Foo?" gets corrects end location for "false" gets corrects end location for "false" gets corrects end location for "::foo" gets corrects end location for "::foo" parses "annotation Foo\nend\nrequire \"bar\"" parses "annotation Foo\nend\nrequire \"bar\"" gets corrects end location for "foo.!" gets corrects end location for "foo.!" says syntax error on "case x; when \"a\"; 2; when \"a\"; end" says syntax error on "case x; when \"a\"; 2; when \"a\"; end" says syntax error on "{\"a\" : 1}" says syntax error on "{\"a\" : 1}" gets corrects end location for "1 if 2" gets corrects end location for "1 if 2" parses "%i{foo\\nbar baz}" parses "%i{foo\\nbar baz}" says syntax error on "%Q(" says syntax error on "%Q(" gets corrects end location for "foo **bar" gets corrects end location for "foo **bar" says syntax error on "%r(" says syntax error on "%r(" sets correct location and end location of parenthesized empty block sets correct location and end location of parenthesized empty block gets corrects end location for "[1, 2]" gets corrects end location for "[1, 2]" gets corrects end location for "{a: 1}" gets corrects end location for "{a: 1}" gets corrects end location for "foo : Foo**" gets corrects end location for "foo : Foo**" sets location of += sets location of += gets corrects end location for "Foo" gets corrects end location for "Foo" gets corrects end location for "typeof(1)" gets corrects end location for "typeof(1)" gets corrects end location for "foo.!()" gets corrects end location for "foo.!()" sets correct location of trailing ensure sets correct location of trailing ensure parses "%i(foo(bar) baz)" parses "%i(foo(bar) baz)" sets correct location for fun def on multiple lines sets correct location for fun def on multiple lines gets corrects end location for "/foo/" gets corrects end location for "/foo/" says syntax error on "%i(" says syntax error on "%i(" 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" says syntax error on "case x; when 1; when _; end" says syntax error on "case x; when 1; when _; end" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "{1 => 2\n,3 => 4}" says syntax error on "{1 => 2\n,3 => 4}" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" gets corrects end location for ":foo" gets corrects end location for ":foo" sets correct location of var in macro for loop sets correct location of var in macro for loop gets corrects end location for "foo : Foo*" gets corrects end location for "foo : Foo*" says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" says syntax error on "def foo(x : Array({sizeof(Int32), 2})); end" doesn't override yield with macro yield doesn't override yield with macro yield gets corrects end location for "f.x=(*foo)" gets corrects end location for "f.x=(*foo)" gets corrects end location for "foo.nil?( )" gets corrects end location for "foo.nil?( )" 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 ensure 2" gets corrects end location for "1 ensure 2" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "%w(one two)" gets corrects end location for "%w(one two)" gets corrects end location for var + var gets corrects end location for var + var gets corrects end location for "return" gets corrects end location for "return" says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "def foo(x\n,y); 1; end" says syntax error on "def foo(x\n,y); 1; end" says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" says syntax error on "def foo(x : {Int32, (Int32, Int32)}); end" sets correct locations of macro if / else sets correct locations of macro if / else gets corrects end location for block with do ... end gets corrects end location for block with do ... end 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 "123" gets corrects end location for "123" says syntax error on "{1\n,2}" says syntax error on "{1\n,2}" gets corrects end location for "f.x=(foo).bar" gets corrects end location for "f.x=(foo).bar" says syntax error on "<<-HEREDOC" says syntax error on "<<-HEREDOC" gets corrects end location for "Int[8]?" gets corrects end location for "Int[8]?" gets corrects end location for "include Foo" gets corrects end location for "include Foo" sets location of top-level fun name sets location of top-level fun name sets correct location of trailing rescue sets correct location of trailing rescue gets correct location after macro with yield gets correct location after macro with yield gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for "begin; 1; 2; 3; end" says syntax error on "def foo(x : (*Int32)); end" says syntax error on "def foo(x : (*Int32)); end" gets correct location of empty exception handler inside def gets correct location of empty exception handler inside def says syntax error on "case x; when nil; 2; when nil; end" says syntax error on "case x; when nil; 2; when nil; end" gets corrects end location for "require \"foo\"" gets corrects end location for "require \"foo\"" gets corrects end location for "def foo; end" gets corrects end location for "def foo; end" gets corrects end location for "123.45" gets corrects end location for "123.45" parses "annotation Foo::Bar\n\nend" parses "annotation Foo::Bar\n\nend" says syntax error on "%x(" says syntax error on "%x(" gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "offsetof({X, Y}, 1)" parses "%w{one\ttwo}" parses "%w{one\ttwo}" sets correct location of implicit tuple literal of multi-return sets correct location of implicit tuple literal of multi-return says syntax error on "def foo(x : (Int32, Int32)); end" says syntax error on "def foo(x : (Int32, Int32)); end" gets corrects end location for "[] of Int32" gets corrects end location for "[] of Int32" gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "@@a = uninitialized Foo" sets location of enum method sets location of enum method says syntax error on "case x; when 1, _; end" says syntax error on "case x; when 1, _; end" gets corrects end location for var gets corrects end location for var gets corrects end location for "class Foo; end" gets corrects end location for "class Foo; end" sets correct locations of macro if / elsif sets correct locations of macro if / elsif gets corrects end location for "yield 1" gets corrects end location for "yield 1" gets corrects end location for "while 1; end" gets corrects end location for "while 1; end" sets correct location of `else` of if statement sets correct location of `else` of if statement 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 "%i{one}}" says syntax error on "%i{one}}" gets corrects end location for "foo ->@bar.baz=" gets corrects end location for "foo ->@bar.baz=" 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" gets corrects end location for "foo" says syntax error on "case x; when [1, 2]; 2; when [1, 2]; end" says syntax error on "case x; when [1, 2]; 2; when [1, 2]; end" gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "foo.responds_to? :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" parses "%w{\\{one}" parses "%w{\\{one}" sets correct location and end location of `begin` block sets correct location and end location of `begin` block 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 "puts obj.foo" gets corrects end location for "puts obj.foo" sets location of lib fun name sets location of lib fun name 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 "if 1; else; 2; end" gets corrects end location for "if 1; else; 2; end" parses "%w{one two}" parses "%w{one two}" gets corrects end location for "[1, 2,]" gets corrects end location for "[1, 2,]" parses "annotation Foo; end" parses "annotation Foo; end" gets corrects end location for "'a'" gets corrects end location for "'a'" gets corrects end location for "{1, 2}" gets corrects end location for "{1, 2}" says syntax error on "def foo(x : 1); end" says syntax error on "def foo(x : 1); end" gets corrects of ~ gets corrects of ~ gets corrects end location for "alias Foo = Bar" gets corrects end location for "alias Foo = Bar" gets corrects end location for "struct Foo; end" gets corrects end location for "struct Foo; end" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" gets corrects end location for "foo.@foo" gets corrects end location for "foo.@foo" parses "foo = 1; ->foo.<<(Int32)" parses "foo = 1; ->foo.<<(Int32)" parses "%r(/)" parses "%r(/)" parses "def foo(var : self?); end" parses "def foo(var : self?); end" parses "foo(&.as?(T))" parses "foo(&.as?(T))" parses "a = 1; a &-=\n1" parses "a = 1; a &-=\n1" parses "->@@foo.foo?" parses "->@@foo.foo?" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "def self.!~(); end;" parses "def self.!~(); end;" parses "foo.==(1, 2) { 3 }" parses "foo.==(1, 2) { 3 }" says syntax error on "def foo\nmacro\nend" says syntax error on "def foo\nmacro\nend" parses "foo(0, n =~ 2)" parses "foo(0, n =~ 2)" parses "a, b, *c = 1" parses "a, b, *c = 1" parses "/\\ /" parses "/\\ /" parses "def >=(); end;" parses "def >=(); end;" parses "foo(n < 2)" parses "foo(n < 2)" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "a.foo, a.bar = 1, 2" parses "a.foo, a.bar = 1, 2" parses "def ===; end;" parses "def ===; end;" parses "n ** 2" parses "n ** 2" parses "::Foo{\"x\" => \"y\"}" parses "::Foo{\"x\" => \"y\"}" says syntax error on "return ? 1 : 2" says syntax error on "return ? 1 : 2" parses "foo[\nfoo[\n1\n]\n]" parses "foo[\nfoo[\n1\n]\n]" parses "1 <= 2 <= 3" parses "1 <= 2 <= 3" parses "{/ /, / /}" parses "{/ /, / /}" parses "{% if x %}body{% end %}" parses "{% if x %}body{% end %}" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" parses "n / 2" parses "n / 2" says syntax error on "def foo(foo sizeof); end" says syntax error on "def foo(foo sizeof); end" parses "foo = 1; ->foo.-(Int32)" parses "foo = 1; ->foo.-(Int32)" parses "asm(\"bl trap\" :::: \"unwind\")" parses "asm(\"bl trap\" :::: \"unwind\")" parses ":*" parses ":*" parses ":-" parses ":-" parses ":\u304B\u305F\u306A" parses ":\u304B\u305F\u306A" parses "foo.is_a?(Foo | Bar)" parses "foo.is_a?(Foo | Bar)" parses "def self.==; end;" parses "def self.==; end;" parses "foo./ do end" parses "foo./ do end" parses "class Foo < self; end" parses "class Foo < self; end" says syntax error on "def foo() :String\nend" says syntax error on "def foo() :String\nend" says syntax error on "->(x y) { }" says syntax error on "->(x y) { }" says syntax error on "1 if next" says syntax error on "1 if next" says syntax error on "def foo(foo self); end" says syntax error on "def foo(foo self); end" parses "def foo(@pointerof); end" parses "def foo(@pointerof); end" parses "->Foo.-(Int32)" parses "->Foo.-(Int32)" says syntax error on "pointerof(self)" says syntax error on "pointerof(self)" parses "next" parses "next" parses "case 1\nin Int32.class; 2; end" parses "case 1\nin Int32.class; 2; end" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" says syntax error on "foo.&&()" says syntax error on "foo.&&()" parses "def foo(unless foo); end" parses "def foo(unless foo); end" parses "def <<(); end" parses "def <<(); end" 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 "if 1 == 1 a; end" says syntax error on "if 1 == 1 a; end" says syntax error on "foo { |asm| }" says syntax error on "foo { |asm| }" parses "yield if true" parses "yield if true" parses "def /; end;" parses "def /; end;" parses "foo.> 1, 2" parses "foo.> 1, 2" says syntax error on "a = a" says syntax error on "a = a" says syntax error on "foo { |(asm)| }" says syntax error on "foo { |(asm)| }" says syntax error on "macro foo *y;end" says syntax error on "macro foo *y;end" parses "foo\n .bar" parses "foo\n .bar" parses ":foo!" parses ":foo!" parses "lib LibC; fun foo(a : Int*); end" parses "lib LibC; fun foo(a : Int*); end" parses "foo = 1; ->foo.%(Int32)" parses "foo = 1; ->foo.%(Int32)" parses "{% begin %}%( %s ){% end %}" parses "{% begin %}%( %s ){% end %}" says syntax error on "def foo(foo begin); end" says syntax error on "def foo(foo begin); end" parses "def foo(x @@fun); end" parses "def foo(x @@fun); end" parses "a = 1; yield a ensure a" parses "a = 1; yield a ensure a" parses "var.@foo.@bar" parses "var.@foo.@bar" parses "foo(0, n == 2)" parses "foo(0, n == 2)" parses "{\"\".id}" parses "{\"\".id}" parses "nil : Int32" parses "nil : Int32" parses "def %; end;" parses "def %; end;" parses "next *1" parses "next *1" parses "macro -;end" parses "macro -;end" says syntax error on "x++" says syntax error on "x++" parses "instance_alignof(X)" parses "instance_alignof(X)" parses "foo.[]=(1, 2) { 3 }" parses "foo.[]=(1, 2) { 3 }" parses "foo if 3" parses "foo if 3" says syntax error on "1 2" says syntax error on "1 2" parses "Int[8]?" parses "Int[8]?" parses "a.b / 2" parses "a.b / 2" says syntax error on "break &* 1" says syntax error on "break &* 1" parses "foo(1)" parses "foo(1)" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "a = 1; a &-= 1" parses "a = 1; a &-= 1" 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 )" parses "foo[0] = 1 if 2" parses "foo[0] = 1 if 2" says syntax error on "foo { |next| }" says syntax error on "foo { |next| }" says syntax error on "return & 1" says syntax error on "return & 1" parses ":[]?" parses ":[]?" parses "def foo(x, *args, y = 2); 1; end" parses "def foo(x, *args, y = 2); 1; end" parses "Foo.foo(count: 3).bar { }" parses "Foo.foo(count: 3).bar { }" says syntax error on "b! = 1" says syntax error on "b! = 1" parses "begin; 1; 2; 3; end;" parses "begin; 1; 2; 3; end;" parses "-1.0_f32" parses "-1.0_f32" parses "foo &.!" parses "foo &.!" parses "rescue : Int32" parses "rescue : Int32" parses "def foo(@@abstract); end" parses "def foo(@@abstract); end" sets correct location of argument in named tuple type sets correct location of argument in named tuple type says syntax error on "{1, 2 3}" says syntax error on "{1, 2 3}" parses "def foo(x @@sizeof); end" parses "def foo(x @@sizeof); end" says syntax error on "return / 1" says syntax error on "return / 1" parses "n !~ 2" parses "n !~ 2" parses "Foo(1)" parses "Foo(1)" parses "foo %r()" parses "foo %r()" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "foo(0, n &** 2)" parses "foo(0, n &** 2)" parses "next {1 => 2}" parses "next {1 => 2}" parses "foo.bar(1, 2)" parses "foo.bar(1, 2)" parses "false" parses "false" 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 "property abstract : Int32" parses "property abstract : Int32" parses "case 1\nin nil; 2; end" parses "case 1\nin nil; 2; end" says syntax error on " {1, 2, 3 end" says syntax error on " {1, 2, 3 end" parses "1_i128" parses "1_i128" parses "def foo(a, &block : -> Double); end" parses "def foo(a, &block : -> Double); end" parses "1.as(Bar)" parses "1.as(Bar)" says syntax error on "foo &.&&" says syntax error on "foo &.&&" parses "abstract def foo : Int32" parses "abstract def foo : Int32" parses "def foo(@break); end" parses "def foo(@break); end" parses "foo[\n1\n]" parses "foo[\n1\n]" parses "def self.>=(); end;" parses "def self.>=(); end;" parses "1 +2.0" parses "1 +2.0" says syntax error on "def foo &block ; end" says syntax error on "def foo &block ; end" parses "1 * 2" parses "1 * 2" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "def foo(abstract foo); end" parses "def foo(abstract foo); end" parses "foo.* do end" parses "foo.* do end" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" parses "def foo=(value); end" parses "def foo=(value); end" says syntax error on "def foo(foo pointerof); end" says syntax error on "def foo(foo pointerof); end" parses "->Foo.>>(Int32)" parses "->Foo.>>(Int32)" says syntax error on "foo(&block) {}" says syntax error on "foo(&block) {}" parses "1 ^ 2" parses "1 ^ 2" parses "[1, 2]" parses "[1, 2]" parses "foo(&.as(T).bar)" parses "foo(&.as(T).bar)" parses "def self./; end;" parses "def self./; end;" says syntax error on "foo { |require| }" says syntax error on "foo { |require| }" parses "def self.>(); end;" parses "def self.>(); end;" parses "def foo(var : (Int, Float) -> Double); end" parses "def foo(var : (Int, Float) -> Double); end" parses ":**" parses ":**" parses "\"hello \\\r\n world\"" parses "\"hello \\\r\n world\"" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "def foo(x @@case); end" parses "def foo(x @@case); end" parses "macro foo(@[Foo] outer inner);end" parses "macro foo(@[Foo] outer inner);end" parses "a.foo &block" parses "a.foo &block" parses "1 > 2" parses "1 > 2" parses ":>=" parses ":>=" parses "foo &.each {\n}" parses "foo &.each {\n}" parses "a = 1; yield a rescue a" parses "a = 1; yield a rescue a" sets correct location of named tuple type sets correct location of named tuple type parses "->foo=" parses "->foo=" parses "foo bar.baz(1) do\nend" parses "foo bar.baz(1) do\nend" parses "lib LibC\nfun getchar(...)\nend" parses "lib LibC\nfun getchar(...)\nend" parses "foo do; 1; end" parses "foo do; 1; end" parses "def foo; a = 1; a {}; end" parses "def foo; a = 1; a {}; end" parses "property case : Int32" parses "property case : Int32" says syntax error on "foo { |end| }" says syntax error on "foo { |end| }" says syntax error on "def foo(break); end" says syntax error on "def foo(break); end" parses "macro foo(x = __LINE__);end" parses "macro foo(x = __LINE__);end" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "def foo(x @@lib); end" parses "def foo(x @@lib); end" says syntax error on "offsetof(X, 'c')" says syntax error on "offsetof(X, 'c')" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "{% begin %}%Q< %s >{% end %}" parses "{% begin %}%Q< %s >{% end %}" says syntax error on "def foo(x, *); 1; end" says syntax error on "def foo(x, *); 1; end" parses "`foo\\``" parses "`foo\\``" parses "@a : Foo | Int32" parses "@a : Foo | Int32" parses "f ->{ a do\n end\n }" parses "f ->{ a do\n end\n }" parses "foo(/ /, / /)" parses "foo(/ /, / /)" parses "typeof(\n 1\n)" parses "typeof(\n 1\n)" says syntax error on "def foo(fun); end" says syntax error on "def foo(fun); end" parses "foo(z: 0, a: n * 2)" parses "foo(z: 0, a: n * 2)" says syntax error on "foo(next)" says syntax error on "foo(next)" parses "property while : Int32" parses "property while : Int32" says syntax error on "\"hello\" foo" says syntax error on "\"hello\" foo" parses "f.x ^= 2" parses "f.x ^= 2" parses "while true; 1; end;" parses "while true; 1; end;" says syntax error on "if return; end" says syntax error on "if return; end" parses "case 1\nwhen 1\n2\nend" parses "case 1\nwhen 1\n2\nend" parses "1 ... 2" parses "1 ... 2" parses "property enum : Int32" parses "property enum : Int32" parses "foo(n =~ 2)" parses "foo(n =~ 2)" parses "def foo(@typeof); end" parses "def foo(@typeof); end" says syntax error on "def foo\nclass\nend" says syntax error on "def foo\nclass\nend" parses "def foo(@out); end" parses "def foo(@out); end" parses "foo(&.block)" parses "foo(&.block)" parses "->Foo::Bar::Baz.foo" parses "->Foo::Bar::Baz.foo" parses "1 - 2" parses "1 - 2" says syntax error on "foo { |(def)| }" says syntax error on "foo { |(def)| }" says syntax error on "break ^ 1" says syntax error on "break ^ 1" parses "foo.nil?" parses "foo.nil?" parses "->\n:\nInt32\n{\n}" parses "->\n:\nInt32\n{\n}" parses "{[] of Foo, Bar::Baz + 2}" parses "{[] of Foo, Bar::Baz + 2}" parses "foo &.[0]" parses "foo &.[0]" parses "def foo(x @until); end" parses "def foo(x @until); end" parses "def foo(pointerof foo); end" parses "def foo(pointerof foo); end" parses "break {1, 2}" parses "break {1, 2}" parses "def /(); end;" parses "def /(); end;" parses "alias Foo::Bar = Baz" parses "alias Foo::Bar = Baz" parses "def >(); end" parses "def >(); end" says syntax error on "macro foo x y; end" says syntax error on "macro foo x y; end" parses "instance_sizeof : Int32" parses "instance_sizeof : Int32" says syntax error on "def foo(next); end" says syntax error on "def foo(next); end" parses "foo = 1; ->foo.>(Int32)" parses "foo = 1; ->foo.>(Int32)" parses "def foo(yield foo); end" parses "def foo(yield foo); end" parses "call \"foo\"" parses "call \"foo\"" says syntax error on "foo { |return| }" says syntax error on "foo { |return| }" parses "/fo\\so/" parses "/fo\\so/" says syntax error on "return do\nend" says syntax error on "return do\nend" parses ":===" parses ":===" parses "def foo(x @@extend); end" parses "def foo(x @@extend); end" parses "x = 1 ensure 2" parses "x = 1 ensure 2" parses "def self.&(); end;" parses "def self.&(); end;" says syntax error on "foo(foo(&.block)" says syntax error on "foo(foo(&.block)" parses "def >=(); end" parses "def >=(); end" parses "+1.0_f32" parses "+1.0_f32" parses "[] of Int" parses "[] of Int" parses "def foo(var : Int, Float -> Double); end" parses "def foo(var : Int, Float -> Double); end" parses "foo.responds_to?(:foo)" parses "foo.responds_to?(:foo)" parses "fun foo : Int32; 1; end; 2" parses "fun foo : Int32; 1; end; 2" parses "begin; 1; end;" parses "begin; 1; end;" parses "`foo\#{1}bar`" parses "`foo\#{1}bar`" parses "1.!" parses "1.!" parses "foo.!~(1, 2) { 3 }" parses "foo.!~(1, 2) { 3 }" says syntax error on "def foo(foo out); end" says syntax error on "def foo(foo out); end" says syntax error on "foo &.&&()" says syntax error on "foo &.&&()" Lexer doc resets doc after non newline or space token resets doc after non newline or space token lexes with doc enabled but without docs lexes with doc enabled but without docs lexes without doc enabled lexes without doc enabled lexes with doc enabled and docs lexes with doc enabled and docs 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 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 Semantic: alias reopens struct through alias reopens struct through alias can use .class in alias (#2835) can use .class in alias (#2835) uses constant in alias with math (#3259) uses constant in alias with math (#3259) errors if alias is already defined as another type errors if alias is already defined as another type reopens module through alias reopens module through alias resolves type through alias (#563) resolves type through alias (#563) inherits class through alias inherits class through alias includes module through alias includes module through alias errors if declares alias inside if errors if declares alias inside if declares alias inside type declares alias inside type works with alias type as restriction works with alias type as restriction errors if defining infinite recursive alias in union errors if defining infinite recursive alias in union can pass recursive alias to proc can pass recursive alias to proc allows defining recursive aliases allows defining recursive aliases reopens module through alias within itself reopens module through alias within itself inherits struct through alias inherits struct through alias uses constant in alias (#3259) uses constant in alias (#3259) doesn't crash by infinite recursion against type alias and generics (#5329) doesn't crash by infinite recursion against type alias and generics (#5329) errors if trying to resolve type of recursive alias errors if trying to resolve type of recursive alias errors if defining infinite recursive alias errors if defining infinite recursive alias errors if trying to use typeof in alias errors if trying to use typeof in alias allows recursive array with alias allows recursive array with alias reopens struct through alias within itself reopens struct through alias within itself allows using generic type of recursive alias as restriction (#488) allows using generic type of recursive alias as restriction (#488) allows using alias type as generic type allows using alias type as generic type errors if alias already defined errors if alias already defined reopens class through alias within itself reopens class through alias within itself allows defining recursive fun aliases allows defining recursive fun aliases resolves alias type resolves alias type looks up alias for macro resolution (#3548) looks up alias for macro resolution (#3548) finds type through alias (#4645) finds type through alias (#4645) overloads union type through alias overloads union type through alias doesn't find type parameter in alias (#3502) doesn't find type parameter in alias (#3502) reopens class through alias reopens class through alias Code gen: multi assign 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, splat is empty (3) supports 1 to n assignment, splat is empty (3) supports m to n assignment, splat is empty tuple (2) supports m to n assignment, splat is empty tuple (2) 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 (2) supports 1 to n assignment, splat is empty (2) supports 1 to n assignment, with splat on left-hand side (2) supports 1 to n assignment, with splat on left-hand side (2) strict_multi_assign 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 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 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 (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 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 (1) supports m to n assignment, splat is empty tuple (1) 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, 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, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports 1 to n assignment, splat is empty (1) supports m to n assignment, with splat on left-hand side (2) supports m to n assignment, with splat on left-hand side (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports n to n assignment supports n to n assignment Semantic: private gives private constant error in macro gives private constant error in macro 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 macro defined through macro (#8715) doesn't find private macro defined through macro (#8715) doesn't find private class from outside namespace, long name (#8831) doesn't find private class from outside namespace, long name (#8831) doesn't find private constant in another file (#7850) doesn't find private constant in another file (#7850) finds private macro in same file finds private macro in same file doesn't define private class with global type name doesn't define private class with global type name finds private class in macro expansion finds private class in macro expansion doesn't find private def in another file doesn't find private def in another file finds private macro in same file, invoking from another macro (#1265) finds private macro in same file, invoking from another macro (#1265) 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 lib from outside namespace, long name (#8831) doesn't find private lib from outside namespace, long name (#8831) doesn't define private enum with global type name doesn't define private enum with global type name finds private def when invoking from inside macro (#2082) finds private def when invoking from inside macro (#2082) finds private type in same file finds private type in same file 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 defined through macro (#8715) doesn't find private module defined through macro (#8715) finds private type from inside namespace in subclass finds private type from inside namespace in subclass doesn't find private enum from outside namespace, long name (#8831) doesn't find private enum from outside namespace, long name (#8831) doesn't define private constant with global type name doesn't define private constant with global type name finds private def in same file finds private def in same file doesn't find private macro in another file doesn't find private macro in another file finds private def in same file that invokes another def finds private def in same file that invokes another def doesn't define private module with global type name doesn't define private module with global type name can use instance var initializer in private type can use instance var initializer in private type 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 def defined in macro in another file (#7681) doesn't find private def defined in macro in another file (#7681) doesn't find private alias in another file doesn't find private alias in another file finds private type from inside namespace finds private type from inside namespace doesn't find private thing defined through recursive macro (#8715) doesn't find private thing defined through recursive macro (#8715) doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) can use class var initializer in private type can use class var initializer in private type doesn't find private alias from outside namespace doesn't find private alias from outside namespace doesn't find private module from outside namespace doesn't find private module from outside namespace doesn't find private class from outside namespace doesn't find private class from outside namespace doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) doesn't define private alias with global type name doesn't define private alias with global type name doesn't find private lib from outside namespace doesn't find private lib from outside namespace doesn't find private class in another file doesn't find private class in another file doesn't find private constant from outside namespace doesn't find private constant 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) can use types in private type can use types in private type 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) find module private macro inside the module find module private macro inside the module types private def correctly types private def correctly doesn't find private enum from outside namespace doesn't find private enum from outside namespace doesn't find private class defined through macro (#8715) doesn't find private class defined through macro (#8715) doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) doesn't define private lib with global type name doesn't define private lib 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 Code gen: method_missing does method_missing macro with virtual type (5) does method_missing macro with virtual type (5) does method_missing macro with virtual type (6) does method_missing macro with virtual type (6) does method_missing with assignment (2) (bug) does method_missing with assignment (2) (bug) does method_missing macro with top level method involved does method_missing macro with top level method involved does method_missing macro with block but not using it does method_missing macro with block but not using it does method_missing macro with block does method_missing macro with block 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 with assignment (bug) does method_missing with assignment (bug) finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' does method_missing macro with virtual type (3) does method_missing macro with virtual type (3) forwards forwards 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 (7) does method_missing macro with virtual type (7) does method_missing macro with included module does method_missing macro with included module does method_missing macro with virtual type (1) does method_missing macro with virtual type (1) does method_missing macro with virtual type (2) does method_missing macro with virtual type (2) does method_missing macro with args does method_missing macro with args does method_missing macro without args (with call) does method_missing macro without args (with call) does method_missing macro with module involved does method_missing macro with module involved does method_missing macro with virtual type (4) does method_missing macro with virtual type (4) does method_missing generating method does method_missing generating method does method_missing macro with virtual type (8) does method_missing macro with virtual type (8) works with named arguments (#3654) works with named arguments (#3654) Code gen: named args sends two regular arguments as named arguments in inverted position (1) sends two regular arguments as named arguments in inverted position (1) uses named args in dispatch uses named args in dispatch calls twice with different types calls twice with different types overloads based on required named args overloads based on required named args calls with named arg and other args calls with named arg and other args uses bare splat in new (2) uses bare splat in new (2) overloads based on required named args, with restrictions overloads based on required named args, with restrictions calls with named arg calls with named arg sends two regular arguments as named arguments sends two regular arguments as named arguments calls with named arg as object method calls with named arg as object method sends one regular argument as named argument sends one regular argument as named argument sends two regular arguments as named arguments in inverted position (2) sends two regular arguments as named arguments in inverted position (2) calls new with named arg calls new with named arg Crystal::Command::FlagsVisitor only macro only macro different flags different flags unique flags unique flags Semantic: cast allows casting reference union to void pointer allows casting reference union to void pointer casts from pointer to generic class gives error casts from pointer to generic class gives error doesn't eagerly try to check cast type (#12268) doesn't eagerly try to check cast type (#12268) casts uninstantiated generic class to itself (#10882) casts uninstantiated generic class to itself (#10882) can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) casts to compatible type and use it casts to compatible type and use it disallows casting fun to pointer disallows casting fun to pointer errors if casting nil to Object inside typeof (#2403) errors if casting nil to Object inside typeof (#2403) disallows casting to Object (#815) disallows casting to Object (#815) casts to base class making it virtual (2) casts to base class making it virtual (2) considers else to be unreachable (#9658) considers else to be unreachable (#9658) 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 should error if can't cast even if not instantiated should error if can't cast even if not instantiated doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) casts to bigger union casts to bigger union disallows casting to Reference disallows casting to Reference disallows casting int to pointer disallows casting int to pointer 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) disallows casting pointer to fun disallows casting pointer to fun casts to generic virtual type casts to generic virtual type doesn't cast to unbound generic type (as) (#5927) doesn't cast to unbound generic type (as) (#5927) can cast to metaclass (2) (#11121) can cast to metaclass (2) (#11121) doesn't allow upcast of generic type var (#996) doesn't allow upcast of generic type var (#996) allows casting NoReturn to any type (#2132) allows casting NoReturn to any type (#2132) doesn't cast to unbound generic type (as?) (#5927) doesn't cast to unbound generic type (as?) (#5927) 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 (1) casts to base class making it virtual (1) casts pointer to another type casts pointer to another type casts pointer of one type to another type casts pointer of one type to another type disallows casting to Class disallows casting to Class casts from union to compatible union casts from union to compatible union doesn't cast to virtual primitive (bug) doesn't cast to virtual primitive (bug) can cast to metaclass (bug) can cast to metaclass (bug) 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 module casts to module Code gen: array literal spec creates custom non-generic array, with splats creates custom non-generic array, with splats creates custom generic array creates custom generic array creates custom non-generic array in module creates custom non-generic array in module creates custom generic array in module (#5684) creates custom generic array in module (#5684) creates custom generic array with type var creates custom generic array with type var creates custom generic array, with splats creates custom generic array, with splats creates custom generic array via alias creates custom generic array via alias creates custom non-generic array creates custom non-generic array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works assignment in array-like literal works creates custom generic array via alias (2) creates custom generic array via alias (2) creates custom non-generic array in nested module creates custom non-generic array in nested module Code gen: hooks 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 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 included macro does included macro Crystal::Repl::Interpreter math interprets Int32 * Int32 interprets Int32 * Int32 interprets UInt64 & Int32 interprets UInt64 & Int32 interprets Float64 - Float64 interprets Float64 - Float64 interprets Int32 &+ Int32 interprets Int32 &+ Int32 interprets Float64 + Float64 interprets Float64 + Float64 interprets Float64 * Float64 interprets Float64 * Float64 interprets Int32 - Int32 interprets Int32 - Int32 interprets Int32 &* Int32 interprets Int32 &* Int32 interprets Float64 + Int32 interprets Float64 + Int32 interprets UInt64 | UInt32 interprets UInt64 | UInt32 discards math discards math interprets UInt64 * Int32 interprets UInt64 * Int32 interprets Int64 + Int64 interprets Int64 + Int64 interprets UInt8 | Int32 interprets UInt8 | Int32 interprets Int32.unsafe_shl(Int32) with self interprets Int32.unsafe_shl(Int32) with self interprets Int32 + Float64 interprets Int32 + Float64 interprets Int8 + Int8 interprets Int8 + Int8 interprets Int32 + Int32 interprets Int32 + Int32 interprets UInt32 - Int32 interprets UInt32 - Int32 interprets Int32 &- Int32 interprets Int32 &- Int32 interprets Float32 + Float64 interprets Float32 + Float64 interprets Int128 + Int32 interprets Int128 + Int32 logical operations interprets not for generic module interprets not for generic module interprets not for generic module metaclass interprets not for generic module metaclass interprets not for nilable type (false) interprets not for nilable type (false) interprets not for mixed union (other) interprets not for mixed union (other) discards bool not discards bool not interprets not for nilable type (true) interprets not for nilable type (true) interprets not for generic class instance type interprets not for generic class instance type discards nil not discards nil not interprets not for bool false interprets not for bool false interprets not for nil interprets not for nil interprets not for mixed union (true) interprets not for mixed union (true) does math primitive on union does math primitive on union interprets not for nilable type (false) interprets not for nilable type (false) interprets not for mixed union (nil) interprets not for mixed union (nil) interprets not for module (#12918) interprets not for module (#12918) interprets not for nil type interprets not for nil type interprets not for nilable proc type (true) interprets not for nilable proc type (true) interprets not for nilable proc type (false) interprets not for nilable proc type (false) interprets not for nilable type (true) interprets not for nilable type (true) interprets not for mixed union (false) interprets not for mixed union (false) interprets not for generic class instance metaclass interprets not for generic class instance metaclass interprets not for bool true interprets not for bool true interprets not for bool false interprets not for bool false does math convert on union does math convert on union local variables doesn't discard underscore right hand side doesn't discard underscore right hand side assigns to underscore assigns to underscore interprets at the class level interprets at the class level interprets variable set and get interprets variable set and get interprets uninitialized interprets uninitialized interprets variable set interprets variable set interprets local variable declaration (#12229) interprets local variable declaration (#12229) interprets variable set and get with operations interprets variable set and get with operations doesn't declare variable with no type doesn't declare variable with no type interprets variable set with type restriction (#13023) interprets variable set with type restriction (#13023) interprets variable set and get, second local var interprets variable set and get, second local var doesn't declare variable with no type inside method doesn't declare variable with no type inside method conversion interprets Float64#to_u64! (positive) interprets Float64#to_u64! (positive) interprets Float64#to_i8! (positive) interprets Float64#to_i8! (positive) interprets Int64::MIN#to_i16! interprets Int64::MIN#to_i16! interprets Int64::MAX#to_i32! interprets Int64::MAX#to_i32! interprets Int32::MIN#to_i8! interprets Int32::MIN#to_i8! interprets Int8::MIN#to_u16! interprets Int8::MIN#to_u16! interprets Float32#to_i32! (positive) interprets Float32#to_i32! (positive) interprets UInt32::MAX#to_u8! interprets UInt32::MAX#to_u8! interprets Int16::MAX#to_i32! interprets Int16::MAX#to_i32! interprets Int16::MIN#to_u! interprets Int16::MIN#to_u! interprets Int8::MAX#to_u8! interprets Int8::MAX#to_u8! interprets Int8::MIN#to_i8! interprets Int8::MIN#to_i8! interprets Float32#to_i16! (positive) interprets Float32#to_i16! (positive) interprets Int64::MIN#to_f32! interprets Int64::MIN#to_f32! interprets UInt8::MAX#to_i64! interprets UInt8::MAX#to_i64! interprets Float64#to_i32! (positive) interprets Float64#to_i32! (positive) interprets UInt64::MAX#to_f32! interprets UInt64::MAX#to_f32! interprets Int16::MIN#to_f32! interprets Int16::MIN#to_f32! interprets Int64::MAX#to_u16! interprets Int64::MAX#to_u16! interprets UInt16::MAX#to_i32! interprets UInt16::MAX#to_i32! interprets Int64::MIN#to_i32! interprets Int64::MIN#to_i32! interprets Int32::MAX#to_i! interprets Int32::MAX#to_i! interprets Int64::MAX#to_u! interprets Int64::MAX#to_u! interprets Float32#to_f32! (positive) interprets Float32#to_f32! (positive) interprets Float64#to_u16! (positive) interprets Float64#to_u16! (positive) interprets Int32::MAX#to_u8! interprets Int32::MAX#to_u8! interprets Int8::MIN#to_f64! interprets Int8::MIN#to_f64! interprets UInt64::MAX#to_i16! interprets UInt64::MAX#to_i16! interprets Int8::MIN#to_i! interprets Int8::MIN#to_i! interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u16! interprets UInt64::MAX#to_u8! interprets UInt64::MAX#to_u8! interprets Float32#to_i! (positive) interprets Float32#to_i! (positive) interprets Int32::MIN#to_i! interprets Int32::MIN#to_i! interprets UInt16::MAX#to_i64! interprets UInt16::MAX#to_i64! interprets Int8::MAX#to_i! interprets Int8::MAX#to_i! interprets Int16::MAX#to_f64! interprets Int16::MAX#to_f64! interprets Int8::MAX#to_i16! interprets Int8::MAX#to_i16! interprets UInt16::MAX#to_f32! interprets UInt16::MAX#to_f32! interprets UInt16::MAX#to_i! interprets UInt16::MAX#to_i! interprets Int8::MAX#to_i8! interprets Int8::MAX#to_i8! interprets UInt8::MAX#to_u16! interprets UInt8::MAX#to_u16! interprets Int64::MAX#to_i8! interprets Int64::MAX#to_i8! interprets UInt32::MAX#to_i64! interprets UInt32::MAX#to_i64! interprets Int8::MIN#to_i32! interprets Int8::MIN#to_i32! interprets Int32::MIN#to_f32! interprets Int32::MIN#to_f32! interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u16! interprets Int8::MIN#to_u8! interprets Int8::MIN#to_u8! interprets Float32#to_f64! (negative) interprets Float32#to_f64! (negative) UInt8#unsafe_chr UInt8#unsafe_chr interprets Int32::MIN#to_u16! interprets Int32::MIN#to_u16! interprets Int8::MIN#to_u64! interprets Int8::MIN#to_u64! interprets Int64::MIN#to_i64! interprets Int64::MIN#to_i64! interprets Int32::MAX#to_f64! interprets Int32::MAX#to_f64! interprets Int32::MAX#to_i16! interprets Int32::MAX#to_i16! interprets Int32::MIN#to_f64! interprets Int32::MIN#to_f64! interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_u64! interprets UInt8::MAX#to_u64! interprets Float32#to_i16! (negative) interprets Float32#to_i16! (negative) interprets Float64#to_i! (negative) interprets Float64#to_i! (negative) interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_i8! interprets Int8::MAX#to_f64! interprets Int8::MAX#to_f64! interprets UInt16::MAX#to_u32! interprets UInt16::MAX#to_u32! interprets Int32::MIN#to_u32! interprets Int32::MIN#to_u32! interprets UInt8::MAX#to_i! interprets UInt8::MAX#to_i! interprets UInt32::MAX#to_f64! interprets UInt32::MAX#to_f64! interprets Int32::MAX#to_i64! interprets Int32::MAX#to_i64! interprets Int32::MIN#to_u64! interprets Int32::MIN#to_u64! interprets Int64::MAX#to_u64! interprets Int64::MAX#to_u64! interprets Int32::MAX#to_u64! interprets Int32::MAX#to_u64! interprets UInt32::MAX#to_i16! interprets UInt32::MAX#to_i16! interprets Float32#to_u8! (positive) interprets Float32#to_u8! (positive) interprets Int16::MIN#to_i8! interprets Int16::MIN#to_i8! interprets Int8::MAX#to_i64! interprets Int8::MAX#to_i64! interprets Float64#to_i16! (positive) interprets Float64#to_i16! (positive) interprets Float64#to_i! (positive) interprets Float64#to_i! (positive) discards conversion with local var discards conversion with local var interprets Int16::MAX#to_u! interprets Int16::MAX#to_u! interprets UInt16::MAX#to_i16! interprets UInt16::MAX#to_i16! interprets UInt16::MAX#to_i8! interprets UInt16::MAX#to_i8! interprets Float64#to_i32! (negative) interprets Float64#to_i32! (negative) interprets Int16::MIN#to_i64! interprets Int16::MIN#to_i64! interprets Int16::MIN#to_u8! interprets Int16::MIN#to_u8! interprets UInt8::MAX#to_u8! interprets UInt8::MAX#to_u8! interprets Int32::MAX#to_u32! interprets Int32::MAX#to_u32! interprets UInt64::MAX#to_i8! interprets UInt64::MAX#to_i8! interprets UInt16::MAX#to_u64! interprets UInt16::MAX#to_u64! interprets Int8::MAX#to_u! interprets Int8::MAX#to_u! interprets Float32#to_i64! (positive) interprets Float32#to_i64! (positive) interprets Int64::MIN#to_f64! interprets Int64::MIN#to_f64! interprets Int32::MIN#to_i16! interprets Int32::MIN#to_i16! interprets Int8::MAX#to_u32! interprets Int8::MAX#to_u32! interprets Float64#to_u32! (positive) interprets Float64#to_u32! (positive) interprets UInt64::MAX#to_u16! interprets UInt64::MAX#to_u16! interprets Int32::MIN#to_i32! interprets Int32::MIN#to_i32! interprets UInt64::MAX#to_f64! interprets UInt64::MAX#to_f64! interprets Int16::MAX#to_i16! interprets Int16::MAX#to_i16! interprets Float32#to_i! (negative) interprets Float32#to_i! (negative) interprets UInt64::MAX#to_u32! interprets UInt64::MAX#to_u32! interprets Int8::MAX#to_i32! interprets Int8::MAX#to_i32! interprets Int8::MIN#to_i64! interprets Int8::MIN#to_i64! interprets Float32#to_i8! (negative) interprets Float32#to_i8! (negative) interprets UInt32::MAX#to_u32! interprets UInt32::MAX#to_u32! interprets UInt16::MAX#to_u8! interprets UInt16::MAX#to_u8! interprets UInt16::MAX#to_u16! interprets UInt16::MAX#to_u16! interprets Float64#to_f32! (negative) interprets Float64#to_f32! (negative) interprets Float64#to_u! (positive) interprets Float64#to_u! (positive) interprets Int32::MAX#to_u16! interprets Int32::MAX#to_u16! interprets Int16::MIN#to_f64! interprets Int16::MIN#to_f64! interprets Int64::MAX#to_f32! interprets Int64::MAX#to_f32! interprets Int16::MAX#to_u32! interprets Int16::MAX#to_u32! interprets Int16::MAX#to_u16! interprets Int16::MAX#to_u16! interprets Int16::MAX#to_u8! interprets Int16::MAX#to_u8! interprets Int64::MIN#to_u64! interprets Int64::MIN#to_u64! interprets Int16::MAX#to_i64! interprets Int16::MAX#to_i64! interprets Int16::MIN#to_i16! interprets Int16::MIN#to_i16! interprets UInt8::MAX#to_i32! interprets UInt8::MAX#to_i32! interprets Float32#to_u16! (positive) interprets Float32#to_u16! (positive) interprets UInt8::MAX#to_f64! interprets UInt8::MAX#to_f64! discards conversion discards conversion interprets Int32::MAX#to_u! interprets Int32::MAX#to_u! interprets Float32#to_u! (positive) interprets Float32#to_u! (positive) interprets Int64::MAX#to_f64! interprets Int64::MAX#to_f64! interprets Float32#to_i8! (positive) interprets Float32#to_i8! (positive) interprets Int64::MIN#to_u32! interprets Int64::MIN#to_u32! interprets UInt16::MAX#to_u! interprets UInt16::MAX#to_u! interprets Float64#to_u8! (positive) interprets Float64#to_u8! (positive) interprets Float32#to_u32! (positive) interprets Float32#to_u32! (positive) interprets UInt16::MAX#to_f64! interprets UInt16::MAX#to_f64! interprets Int8::MIN#to_f32! interprets Int8::MIN#to_f32! interprets Int32::MIN#to_u! interprets Int32::MIN#to_u! interprets Int32::MAX#to_f32! interprets Int32::MAX#to_f32! interprets Float64#to_i16! (negative) interprets Float64#to_i16! (negative) interprets Float32#to_i64! (negative) interprets Float32#to_i64! (negative) interprets Int16::MIN#to_u16! interprets Int16::MIN#to_u16! interprets UInt64::MAX#to_i64! interprets UInt64::MAX#to_i64! interprets Int64::MIN#to_u8! interprets Int64::MIN#to_u8! interprets Int16::MIN#to_i! interprets Int16::MIN#to_i! interprets UInt32::MAX#to_i32! interprets UInt32::MAX#to_i32! interprets UInt8::MAX#to_i8! interprets UInt8::MAX#to_i8! interprets Int8::MIN#to_u! interprets Int8::MIN#to_u! interprets UInt8::MAX#to_i16! interprets UInt8::MAX#to_i16! interprets Int8::MIN#to_i16! interprets Int8::MIN#to_i16! interprets Int64::MAX#to_i! interprets Int64::MAX#to_i! interprets Int64::MAX#to_u32! interprets Int64::MAX#to_u32! interprets Int16::MAX#to_i8! interprets Int16::MAX#to_i8! interprets Int32::MIN#to_i64! interprets Int32::MIN#to_i64! interprets Float64#to_i8! (negative) interprets Float64#to_i8! (negative) interprets Int8::MAX#to_f32! interprets Int8::MAX#to_f32! interprets UInt32::MAX#to_f32! interprets UInt32::MAX#to_f32! interprets Float64#to_f64! (positive) interprets Float64#to_f64! (positive) interprets Float64#to_f32! (positive) interprets Float64#to_f32! (positive) interprets Int64::MAX#to_u8! interprets Int64::MAX#to_u8! interprets Int16::MIN#to_u64! interprets Int16::MIN#to_u64! interprets Float32#to_i32! (negative) interprets Float32#to_i32! (negative) interprets Int64::MAX#to_i16! interprets Int64::MAX#to_i16! interprets Int16::MAX#to_u64! interprets Int16::MAX#to_u64! interprets Int16::MIN#to_i32! interprets Int16::MIN#to_i32! interprets Int8::MIN#to_u32! interprets Int8::MIN#to_u32! interprets Int64::MIN#to_i8! interprets Int64::MIN#to_i8! interprets Int32::MAX#to_i8! interprets Int32::MAX#to_i8! interprets Int16::MAX#to_i! interprets Int16::MAX#to_i! interprets UInt32::MAX#to_u64! interprets UInt32::MAX#to_u64! interprets UInt64::MAX#to_u! interprets UInt64::MAX#to_u! interprets Int16::MAX#to_f32! interprets Int16::MAX#to_f32! Int32#unsafe_chr Int32#unsafe_chr interprets UInt32::MAX#to_i! interprets UInt32::MAX#to_i! interprets Float64#to_i64! (positive) interprets Float64#to_i64! (positive) interprets Float32#to_f32! (negative) interprets Float32#to_f32! (negative) interprets UInt64::MAX#to_u64! interprets UInt64::MAX#to_u64! interprets Int64::MIN#to_u16! interprets Int64::MIN#to_u16! interprets Int64::MAX#to_i64! interprets Int64::MAX#to_i64! interprets Float64#to_i64! (negative) interprets Float64#to_i64! (negative) interprets Int64::MIN#to_u! interprets Int64::MIN#to_u! interprets UInt32::MAX#to_u! interprets UInt32::MAX#to_u! interprets UInt8::MAX#to_u32! interprets UInt8::MAX#to_u32! interprets Float64#to_f64! (negative) interprets Float64#to_f64! (negative) interprets UInt8::MAX#to_u! interprets UInt8::MAX#to_u! interprets UInt64::MAX#to_i32! interprets UInt64::MAX#to_i32! interprets Int64::MIN#to_i! interprets Int64::MIN#to_i! interprets UInt64::MAX#to_i! interprets UInt64::MAX#to_i! interprets Float32#to_f64! (positive) interprets Float32#to_f64! (positive) interprets Int32::MIN#to_u8! interprets Int32::MIN#to_u8! interprets Int32::MAX#to_i32! interprets Int32::MAX#to_i32! interprets Int8::MAX#to_u64! interprets Int8::MAX#to_u64! interprets Float32#to_u64! (positive) interprets Float32#to_u64! (positive) interprets Char#ord interprets Char#ord interprets Int16::MIN#to_u32! interprets Int16::MIN#to_u32! literals interprets a Float64 interprets a Float64 interprets an Int8 interprets an Int8 interprets an Int128 interprets an Int128 interprets an UInt8 interprets an UInt8 interprets an UInt128 interprets an UInt128 interprets nil interprets nil interprets an Int16 interprets an Int16 precomputes string literal length precomputes string literal length interprets a bool (true) interprets a bool (true) interprets an Int32 interprets an Int32 interprets an UInt16 interprets an UInt16 interprets an UInt64 interprets an UInt64 interprets a bool (false) interprets a bool (false) interprets a String literal interprets a String literal interprets an UInt32 interprets an UInt32 interprets an Int64 interprets an Int64 interprets a Float32 interprets a Float32 interprets a char interprets a char uses a string pool uses a string pool overflow - overlows on 1_u8 - 2 overlows on 1_u8 - 2 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_u32 - 2 overlows on 1_u32 - 2 overlows on 1 - 2147483650_i64 overlows on 1 - 2147483650_i64 overlows on 1_u16 - 2 overlows on 1_u16 - 2 overlows on 1_i16 - 32770 overlows on 1_i16 - 32770 overlows on 1_i8 - 256 overlows on 1_i8 - 256 * overlows on 20 * 214748364 overlows on 20 * 214748364 overlows on 10_i8 * 14 overlows on 10_i8 * 14 overlows on 10_u8 * 26 overlows on 10_u8 * 26 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 10_u16 * 6600 overlows on 10_u16 * 6600 overlows on 20_i64 * 922337203685477580_i64 overlows on 20_i64 * 922337203685477580_i64 + overlows on 1_i8 + 128 overlows on 1_i8 + 128 overlows on 1_i16 + 32767 overlows on 1_i16 + 32767 overlows on 1_u8 + 255 overlows on 1_u8 + 255 overlows on 1_u64 + 18446744073709551615_u64 overlows on 1_u64 + 18446744073709551615_u64 overlows on 1_u32 + 4294967295_i64 overlows on 1_u32 + 4294967295_i64 overlows on 1_u16 + 65535 overlows on 1_u16 + 65535 overlows on 1 + 2147483647 overlows on 1 + 2147483647 overlows on 1_i64 + 9223372036854775807_i64 overlows on 1_i64 + 9223372036854775807_i64 conversion overlows on -1_i64.to_u16 overlows on -1_i64.to_u16 overlows on 32768_u64.to_i16 overlows on 32768_u64.to_i16 overlows on 32768_u16.to_i16 overlows on 32768_u16.to_i16 overlows on 256_f32.to_u8 overlows on 256_f32.to_u8 overlows on -1_i64.to_u32 overlows on -1_i64.to_u32 overlows on 128_u16.to_i8 overlows on 128_u16.to_i8 overlows on -1_i64.to_u64 overlows on -1_i64.to_u64 overlows on 128_f64.to_i8 overlows on 128_f64.to_i8 overlows on -1_i16.to_u64 overlows on -1_i16.to_u64 overlows on -1_i16.to_u8 overlows on -1_i16.to_u8 overlows on -1.to_u16 overlows on -1.to_u16 overlows on 128_f32.to_i8 overlows on 128_f32.to_i8 overlows on -1_i8.to_u16 overlows on -1_i8.to_u16 overlows on 32768_f64.to_i16 overlows on 32768_f64.to_i16 overlows on 32768_f32.to_i16 overlows on 32768_f32.to_i16 overlows on 128_u64.to_i8 overlows on 128_u64.to_i8 overlows on 65536_f64.to_u16 overlows on 65536_f64.to_u16 overlows on -1_i16.to_u16 overlows on -1_i16.to_u16 overlows on -1.to_u32 overlows on -1.to_u32 overlows on -1_i8.to_u64 overlows on -1_i8.to_u64 overlows on 4294967296_f64.to_u32 overlows on 4294967296_f64.to_u32 overlows on 128_u8.to_i8 overlows on 128_u8.to_i8 overlows on 256_f64.to_u8 overlows on 256_f64.to_u8 overlows on 2147483648_u64.to_i32 overlows on 2147483648_u64.to_i32 overlows on -1_i16.to_u32 overlows on -1_i16.to_u32 overlows on -1_i8.to_u32 overlows on -1_i8.to_u32 overlows on 9223372036854775808_u64.to_i64 overlows on 9223372036854775808_u64.to_i64 overlows on 1.7976931348623157e+308.to_f32 overlows on 1.7976931348623157e+308.to_f32 overlows on 32768_u32.to_i16 overlows on 32768_u32.to_i16 overlows on -1.to_u8 overlows on -1.to_u8 overlows on 2147483648_f64.to_i32 overlows on 2147483648_f64.to_i32 overlows on -1.to_u64 overlows on -1.to_u64 overlows on 65536_f32.to_u16 overlows on 65536_f32.to_u16 overlows on -1_i64.to_u8 overlows on -1_i64.to_u8 overlows on 128_u32.to_i8 overlows on 128_u32.to_i8 overlows on -1_i8.to_u8 overlows on -1_i8.to_u8 overlows on 2147483648_u32.to_i32 overlows on 2147483648_u32.to_i32 comparisons interprets Int32 == Float64 (false) interprets Int32 == Float64 (false) interprets UInt8 < Int32 (true, right is greater than zero) interprets UInt8 < Int32 (true, right is greater than zero) interprets Char == Char (true) interprets Char == Char (true) interprets UInt64 < Int32 (false, right is greater than zero) interprets UInt64 < Int32 (false, right is greater than zero) interprets Int32 == Int32 (false) interprets Int32 == Int32 (false) interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 < 0) interprets UInt64 == Int32 (false when Int32 < 0) interprets Int32 != UInt64 (true) interprets Int32 != UInt64 (true) interprets Float32 fdiv Float64 interprets Float32 fdiv Float64 interprets UInt8 < Int32 (false, right is less than zero) interprets UInt8 < Int32 (false, right is less than zero) interprets Int32 == UInt64 (true) interprets Int32 == UInt64 (true) interprets Float32 / Float32 interprets Float32 / Float32 interprets UInt64 > UInt32 (false) interprets UInt64 > UInt32 (false) interprets Int32 != Int32 (false) interprets Int32 != Int32 (false) interprets Float64 / Float64 interprets Float64 / Float64 interprets Int32 == Float64 (true) interprets Int32 == Float64 (true) interprets UInt64.unsafe_mod(UInt64) interprets UInt64.unsafe_mod(UInt64) interprets Int32 != Int32 (true) interprets Int32 != Int32 (true) interprets Int32 == UInt64 (false) interprets Int32 == UInt64 (false) interprets UInt64 > UInt32 (true) interprets UInt64 > UInt32 (true) interprets Int32 < Int32 interprets Int32 < Int32 interprets UInt32 < Int32 (false) interprets UInt32 < Int32 (false) interprets Bool != Bool (true) interprets Bool != Bool (true) discards comparison discards comparison interprets UInt32 < Int32 (true) interprets UInt32 < Int32 (true) interprets Int32 != UInt64 (false) interprets Int32 != UInt64 (false) interprets Float32 / Int32 interprets Float32 / Int32 interprets UInt64 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is less than zero) interprets Int128 == Int128 (false) interprets Int128 == Int128 (false) interprets Float64 < Int32 interprets Float64 < Int32 interprets UInt64 != Int32 (false) interprets UInt64 != Int32 (false) interprets UInt64 == Int32 (false when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 >= 0) interprets Bool == Bool (true) interprets Bool == Bool (true) interprets Char == Char (false) interprets Char == Char (false) interprets UInt64 != Int32 (true) interprets UInt64 != Int32 (true) interprets Int128 == Int128 (true) interprets Int128 == Int128 (true) interprets Bool == Bool (false) interprets Bool == Bool (false) interprets UInt8 < Int32 (false, right is greater than zero) interprets UInt8 < Int32 (false, right is greater than zero) interprets Float64 fdiv Float32 interprets Float64 fdiv Float32 interprets Float64 < Float64 interprets Float64 < Float64 interprets Int32 > Float64 (false) interprets Int32 > Float64 (false) interprets Int32 < Float64 interprets Int32 < Float64 interprets Int32 > Float64 (true) interprets Int32 > Float64 (true) interprets Bool != Bool (false) interprets Bool != Bool (false) interprets Int32 == Int32 (true) interprets Int32 == Int32 (true) interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 < Int32 (true, right is greater than zero) Crystal::Doc::Generator #must_include_toplevel? returns false if program has constant which is defined in other place returns false if program has constant which is defined in other place returns false if program has macro which is defined in other place returns false if program has macro which is defined in other place returns false if program has nothing returns false if program has nothing returns true if program has constant returns true if program has constant 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 method returns true if program has method returns true if program has macro returns true if program has macro #formatted_doc 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 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 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 generates sitemap generates sitemap #collect_constants returns empty array when constants are private returns empty array when constants are private crystal repo inserts pseudo methods inserts pseudo methods #formatted_summary 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 no annotation, and no docs should generate nothing should generate nothing with a Experimental annotation, and no docs should generate just the Experimental tag should generate just the Experimental tag should generate the first line should generate the first line should generate the first sentence should generate the first sentence with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag with a Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag Crystal::Codegen::Target parses freebsd version parses freebsd version parses incomplete triples parses incomplete triples normalizes triples normalizes triples Semantic: multi assign strict_multi_assign 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 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 tuple to fewer targets errors if assigning tuple to fewer targets errors if assigning tuple to more targets errors if assigning tuple to more targets errors if assigning non-Indexable (#11414) errors if assigning non-Indexable (#11414) errors if assigning non-Indexable to splat (#11414) errors if assigning non-Indexable to splat (#11414) 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) Code gen: c enum codegens enum value 3 codegens enum value 3 codegens enum that refers to another enum constant codegens enum that refers to another enum constant codegens enum with 100 >> 3 codegens enum with 100 >> 3 codegens enum with -1 codegens enum with -1 codegens enum with 3 &* 2 codegens enum with 3 &* 2 codegens enum with 10 | 3 codegens enum with 10 | 3 codegens enum value 4 codegens enum value 4 codegens enum with 10 % 3 codegens enum with 10 % 3 codegens enum value codegens enum value codegens enum with ~1 codegens enum with ~1 codegens enum with +1 codegens enum with +1 codegens enum with (1 + 2) * 3 codegens enum with (1 + 2) * 3 codegens enum with 3 &- 2 codegens enum with 3 &- 2 codegens enum with 1 + 2 codegens enum with 1 + 2 codegens enum with 1 &+ 2 codegens enum with 1 &+ 2 codegens enum that refers to another constant codegens enum that refers to another constant codegens enum with 10 & 3 codegens enum with 10 & 3 codegens enum with 1 << 3 codegens enum with 1 << 3 codegens enum with 3 - 2 codegens enum with 3 - 2 codegens enum with 10 // 2 codegens enum with 10 // 2 codegens enum value 2 codegens enum value 2 codegens enum with 3 * 2 codegens enum with 3 * 2 codegens enum with 10 ^ 3 codegens enum with 10 ^ 3 Semantic: class var errors if using class variable at the top level errors if using class variable at the top level declares uninitialized (#2935) declares uninitialized (#2935) redefines class variable type redefines class variable type allows class var in primitive types (#612) allows class var in primitive types (#612) errors on undefined constant (1) errors on undefined constant (1) can access constant from generic metaclass (#3719) can access constant from generic metaclass (#3719) infers type from number literal infers type from number literal errors when using Class (#2605) errors when using Class (#2605) errors if using local variable in initializer errors if using local variable in initializer infers in multiple assign for tuple type (1) infers in multiple assign for tuple type (1) 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 when typing a class variable inside a method errors when typing a class variable inside a method 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) types class var as nil if not assigned at the top level types class var as nil if not assigned at the top level errors if class variable not nilable without initializer errors if class variable not nilable without initializer errors if using self as type var but there's no self errors if using self as type var but there's no self doesn't error if accessing class variable before defined (#2941) doesn't error if accessing class variable before defined (#2941) says undefined class variable says undefined class variable doesn't error on recursive dependency if var is nilable (#2943) doesn't error on recursive dependency if var is nilable (#2943) can find class var through included module can find class var through included module errors if redefining class var type in subclass errors if redefining class var type in subclass infers type from T.new infers type from T.new declares class variable (2) declares class variable (2) types class var inside instance method types class var inside instance method 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) declares class var in generic class declares class var in generic class declares class var in generic module declares class var in generic module can find class var in subclass can find class var in subclass 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 types class var types class var types as nilable if doesn't have initializer types as nilable if doesn't have initializer errors if redefining class var type in subclass, with guess errors if redefining class var type in subclass, with guess declares class variable declares class variable errors if redefining class var type in included module errors if redefining class var type in included module allows self.class as type var in class body (#537) allows self.class as type var in class body (#537) Code gen: enum codegens enum None redefined codegens enum None redefined 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) automatically defines question method for each enum member (flags, true case) automatically defines question method for each enum member (flags, true case) can define flags enum : UInt128 with compile-time interpreted values can define flags enum : UInt128 with compile-time interpreted values can use macro calls inside enum value, macro defined outside enum (#424) can use macro calls inside enum value, macro defined outside enum (#424) can use macro calls inside enum value (#424) can use macro calls inside enum value (#424) codegens enum bitflags None codegens enum bitflags None 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) 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 (4) codegens enum bitflags (4) codegens enum without explicit value codegens enum without explicit value casts All value to base type casts All value to base type codegens enum bitflags (1) codegens enum bitflags (1) codegens enum codegens enum can define flags enum : UInt64 with more than 32 values (#7268) can define flags enum : UInt64 with more than 32 values (#7268) can define flags enum : UInt128 with 128 values can define flags enum : UInt128 with 128 values codegens enum value codegens enum value codegens enum All redefined codegens enum All redefined codegens enum bitflags All codegens enum bitflags All can use macro calls inside enum value, with receiver (#424) can use macro calls inside enum value, with receiver (#424) does ~ at compile time for enum member does ~ at compile time for enum member codegens enum bitflags (2) codegens enum bitflags (2) adds a none? method to flags enum adds a none? method to flags enum creates enum from value creates enum from value can redefine Enum.new and use previous_def can redefine Enum.new and use previous_def Semantic: annotation errors when annotate instance variable in subclass errors when annotate instance variable in subclass #annotations all types returns an empty array if there are none defined returns an empty array if there are none defined finds annotations on a class finds annotations on a class adds annotations on def adds annotations on def finds annotations in instance var (declaration) finds annotations in instance var (declaration) finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) finds annotations on a module finds annotations on a module finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) finds annotations on a struct finds annotations on a struct find annotations on method parameters find annotations on method parameters finds annotations on a enum finds annotations on a enum finds annotations on a lib finds annotations on a lib of a specific type can't find annotations in instance var, when other annotations are present can't find annotations in instance var, when other annotations are present can't find annotations in instance var can't find annotations in instance var uses annotations value, keyword uses annotations value, keyword finds annotations in instance var (declaration) finds annotations in instance var (declaration) returns an empty array if there are none defined returns an empty array if there are none defined finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) finds annotations in class finds annotations in class collects annotations values in type collects annotations values in type adds annotations on def adds annotations on def find annotations on method parameters find annotations on method parameters finds annotations in enum finds annotations in enum can't find annotations on def can't find annotations on def can't find annotations on def, when other annotations are present can't find annotations on def, when other annotations are present overrides annotations value in type overrides annotations value in type finds annotations in lib finds annotations in lib finds annotations on a module finds annotations on a module finds annotations in struct finds annotations in struct uses annotations value, positional uses annotations value, positional finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) #annotation finds annotation in instance var (declaration) finds annotation in instance var (declaration) errors if annotation doesn't point to an annotation type errors if annotation doesn't point to an annotation type errors if annotation doesn't exist errors if annotation doesn't exist finds annotation on method double splat arg finds annotation on method double splat arg errors if using annotation other than ThreadLocal for class vars errors if using annotation other than ThreadLocal for class vars finds annotation in instance var (declaration, generic) finds annotation in instance var (declaration, generic) can't find annotation in instance var can't find annotation in instance var finds annotation in class finds annotation in class finds annotation in enum finds annotation in enum adds annotation on def adds annotation on def can't find annotation in module, when other annotations are present can't find annotation in module, when other annotations are present doesn't carry link annotation from lib to fun doesn't carry link annotation from lib to fun finds annotation in lib finds annotation in lib finds annotation on method splat arg finds annotation on method splat arg errors if using invalid annotation on fun errors if using invalid annotation on fun can't find annotation in module can't find annotation in module finds annotation in module finds annotation in module uses annotation value, keyword uses annotation value, keyword can't find annotation in instance var, when other annotations are present can't find annotation in instance var, when other annotations are present finds annotation in instance var (assignment) finds annotation in instance var (assignment) finds annotation on method arg finds annotation on method arg overrides annotation value in type overrides annotation value in type overrides annotation in instance var overrides annotation in instance var can't find annotation on def can't find annotation on def finds annotation in struct finds annotation in struct finds annotation in generic parent (#7885) finds annotation in generic parent (#7885) uses annotation value, positional uses annotation value, positional can't find annotation on def, when other annotations are present can't find annotation on def, when other annotations are present finds annotation on an restricted method block arg finds annotation on an restricted method block arg arguments returns a correctly with named and positional args returns a correctly with named and positional args #args returns an empty TupleLiteral if there are none defined returns an empty TupleLiteral if there are none defined returns a TupleLiteral if there are positional arguments defined returns a TupleLiteral if there are positional arguments defined #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 errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (2) (#8614) errors if wanting to add type inside annotation (2) (#8614) declares annotation declares annotation doesn't bleed annotation from class into class variable (#8314) doesn't bleed annotation from class into class variable (#8314) Semantic: primitives types a int64 types a int64 can invoke binary on primitive typedef (2) (#614) can invoke binary on primitive typedef (2) (#614) types an expression types an expression allows @[Primitive] on method that has body allows @[Primitive] on method that has body types @[Primitive] method types @[Primitive] method types 1 + 2 types 1 + 2 types a symbol types a symbol errors if @[Primitive] has no args errors if @[Primitive] has no args can invoke cast on primitive typedef (#614) can invoke cast on primitive typedef (#614) Reference.pre_initialize errors on uninstantiated generic type errors on uninstantiated generic type types with reference type types with reference type types with virtual reference type types with virtual reference type errors on abstract type errors on abstract type types nil types nil 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 char ord types char ord can invoke binary on primitive typedef (#614) can invoke binary on primitive typedef (#614) types a float64 types a float64 extends from Number and doesn't find + method extends from Number and doesn't find + method types a char types a char errors when comparing void (#225) errors when comparing void (#225) types an int32 types an int32 types a uint128 types a uint128 types nop types nop types a bool types a bool correctly types first hash from type vars (bug) correctly types first hash from type vars (bug) looks up return type in correct scope (#13652) looks up return type in correct scope (#13652) types pointer of int types pointer of int errors if @[Primitive] has non-symbol arg errors if @[Primitive] has non-symbol arg Slice.literal with element type types empty literal types empty literal errors if element type is not primitive int or float errors if element type is not primitive int or float errors if element is out of range errors if element is out of range types primitive int literal types primitive int literal types primitive float literal types primitive float literal errors if element is not number literal errors if element is not number literal extends from Number and doesn't find to_i method extends from Number and doesn't find to_i method types va_arg primitive types va_arg primitive errors if using instance variable inside primitive type errors if using instance variable inside primitive type types a float32 types a float32 extends from Number and doesn't find >= method extends from Number and doesn't find >= method types a string types a string types a int128 types a int128 Semantic: if restricts type with !var.is_a?(...) and || restricts type with !var.is_a?(...) and || restricts with && always falsey restricts with && always falsey restricts && of !var.is_a(...) restricts && of !var.is_a(...) types an if without else types an if without else restricts || else (2) (#3266) restricts || else (2) (#3266) types variable after unreachable else of && (#3360) types variable after unreachable else of && (#3360) restricts type with !var and || restricts type with !var and || doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition doesn't restrict with || on var and non-restricting condition doesn't restrict with || on var and non-restricting condition restricts || else (1) (#3266) restricts || else (1) (#3266) restricts with || (#2464) restricts with || (#2464) types an if with else of same type types an if with else of same type passes bug (related to #1729) passes bug (related to #1729) doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (2) restricts the type of the right hand side of an || when using is_a? (#1728) restricts the type of the right hand side of an || when using is_a? (#1728) restricts || else in sub || (right) restricts || else in sub || (right) doesn't restrict || else in sub && (left) doesn't restrict || else in sub && (left) doesn't consider nil type in else branch with if with && (#7434) doesn't consider nil type in else branch with if with && (#7434) types `if` with `&&` and assignment types `if` with `&&` and assignment restricts type with !var.is_a?(...) and && restricts type with !var.is_a?(...) and && restricts && else in sub && (left) restricts && else in sub && (left) restricts || else in sub || (left) restricts || else in sub || (left) can invoke method on var that is declared on the right hand side of an and can invoke method on var that is declared on the right hand side of an and doesn't restrict || else in sub && (right) doesn't restrict || else in sub && (right) restricts && else in sub && (right) restricts && else in sub && (right) types an if with else of different type types an if with else of different type doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) errors if requires inside if errors if requires inside if restricts with || but doesn't unify types to base class restricts with || but doesn't unify types to base class includes pointer types in falsey branch includes pointer types in falsey branch doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition doesn't filter and recombine when variables don't change in if doesn't filter and recombine when variables don't change in if restricts and doesn't unify union types restricts and doesn't unify union types restricts || of more than 2 clauses (#8864) restricts || of more than 2 clauses (#8864) restricts || else (3) (#3266) restricts || else (3) (#3266) correctly filters type of variable if there's a raise with an interpolation that can't be typed correctly filters type of variable if there's a raise with an interpolation that can't be typed doesn't restrict with || on different vars doesn't restrict with || on different vars Crystal::Repl::Interpreter pointers pointerof read instance var pointerof read instance var discards pointer set discards pointer set interprets pointerof, mutates var, read pointer interprets pointerof, mutates var, read pointer interprets pointer realloc interprets pointer realloc interprets pointer set and get (union type, setter value) interprets pointer set and get (union type, setter value) discards pointer malloc discards pointer malloc interprets pointer set and get (union type) interprets pointer set and get (union type) interprets pointer set and get (int) interprets pointer set and get (int) interprets pointer add interprets pointer add interprets pointerof, mutates pointer, read var interprets pointerof, mutates pointer, read var interprets pointer set and get (clear stack) interprets pointer set and get (clear stack) discards pointer add discards pointer add interprets nilable pointer truthiness interprets nilable pointer truthiness discards pointer realloc discards pointer realloc pointerof read `StaticArray#@buffer` (2) pointerof read `StaticArray#@buffer` (2) pointerof instance var pointerof instance var interprets pointer diff, negative interprets pointer diff, negative pointerof class var pointerof class var discards pointerof discards pointerof discards pointer diff discards pointer diff interprets pointerof and mutates memory (there are more variables) interprets pointerof and mutates memory (there are more variables) interprets pointer new and pointer address interprets pointer new and pointer address pointerof read `StaticArray#@buffer` (1) pointerof read `StaticArray#@buffer` (1) discards pointer get discards pointer get discards pointer new discards pointer new interprets pointer set and get (bool) interprets pointer set and get (bool) interprets pointer diff interprets pointer diff interprets pointer realloc wrapper interprets pointer realloc wrapper Crystal::Repl::Interpreter extern does automatic C cast does automatic C cast interprets primitive struct_or_union_set and get (struct) interprets primitive struct_or_union_set and get (struct) interprets primitive struct_or_union_set and get (union) interprets primitive struct_or_union_set and get (union) sets struct field through pointer sets struct field through pointer discards primitive struct_or_union_set because it's a copy discards primitive struct_or_union_set because it's a copy discards primitive struct_or_union_set and get (struct) discards primitive struct_or_union_set and get (struct) sets extern struct proc field sets extern struct proc field Semantic: require file not found relative wildcard relative wildcard require require wildcard wildcard relative require relative require Semantic: proc allows passing NoReturn type for any return type (3) allows passing NoReturn type for any return type (3) disallows Struct in proc notation return type disallows Struct in proc notation return type accesses T inside variadic generic (2) accesses T inside variadic generic (2) virtualizes proc type (#6789) virtualizes proc type (#6789) declares an instance variable with splat in proc notation declares an instance variable with splat in proc notation allows invoking a function with a generic subtype (2) allows invoking a function with a generic subtype (2) 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) types int -> int proc call types int -> int proc call disallows Class in proc notation return type disallows Class in proc notation return type allows using Proc as restriction (2) allows using Proc as restriction (2) disallows Class in proc pointer disallows Class in proc pointer doesn't let passing an non-covariant generic argument doesn't let passing an non-covariant generic argument disallows Class in procs disallows Class in procs disallows Proc in proc notation return type disallows Proc in proc notation return type types Proc(*T, Void) as Proc(*T, Nil) types Proc(*T, Void) as Proc(*T, Nil) forwards block and computes correct type (bug) forwards block and computes correct type (bug) unpacks tuple but doesn't override local variables, when using new (#9813) unpacks tuple but doesn't override local variables, when using new (#9813) types proc literal with return type (2) types proc literal with return type (2) disallows Class in captured block disallows Class in captured block disallows Tuple in captured block disallows Tuple in captured block disallows StaticArray in proc notation parameter type disallows StaticArray in proc notation parameter type gets pointer to lib fun without specifying types gets pointer to lib fun without specifying types merges return type merges return type 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 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 has proc literal as restriction and errors if input is different has proc literal as restriction and errors if input is different types proc pointer types proc pointer *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) disallows Float in proc notation parameter type disallows Float in proc notation parameter type allows using Proc as restriction (1) allows using Proc as restriction (1) types proc call types proc call disallows casting a proc type to one accepting less arguments disallows casting a proc type to one accepting less arguments can use @@cvar as pointer syntax receiver (#9239) can use @@cvar as pointer syntax receiver (#9239) errors when using local variable with proc argument name errors when using local variable with proc argument name types proc pointer with a type that was never instantiated types proc pointer with a type that was never instantiated disallows Value in captured block disallows Value in captured block ... ... disallows Number in proc notation return type disallows Number in proc notation return type disallows Number in procs disallows Number in procs says wrong number of block params in new on proc type says wrong number of block params in new on proc type allows metaclass in proc pointer allows metaclass in proc pointer allows new on proc type allows new on proc type disallows casting a proc type to one accepting same size argument but different output disallows casting a proc type to one accepting same size argument but different output allows metaclass in proc return types allows metaclass in proc return types disallows Int in proc notation parameter type disallows Int in proc notation parameter type types nil or proc type types nil or proc type has proc literal as restriction and errors if output is different has proc literal as restriction and errors if output is different disallows Proc in proc return types disallows Proc in proc return types allows metaclass in captured block allows metaclass in captured block disallows Pointer in proc return types disallows Pointer in proc return types disallows Float in procs disallows Float in procs accesses T and R accesses T and R disallows Proc in captured block disallows Proc in captured block disallows Enum in captured block disallows Enum in captured block 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 Object in proc return types disallows Object in proc return types types proc type spec types proc type spec disallows Reference in procs disallows Reference in procs disallows Pointer in proc pointer disallows Pointer in proc pointer disallows Tuple in proc notation return type disallows Tuple in proc notation return type 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 Struct in proc return types disallows Struct in proc return types allows metaclass in proc notation return type allows metaclass in proc notation return type disallows Struct in procs disallows Struct in procs allows passing function to LibC without specifying types allows passing function to LibC without specifying types virtualizes proc type with -> (#8730) virtualizes proc type with -> (#8730) disallows Tuple in proc pointer disallows Tuple in proc pointer disallows Class in proc notation parameter type disallows Class in proc notation parameter type disallows Int in proc notation return type disallows Int in proc notation return type disallows Object in captured block disallows Object in captured block types proc pointer with types types proc pointer with types disallows Value in proc return types disallows Value in proc return types disallows Object in procs disallows Object in procs 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 need to deduce type of block if return is void doesn't need to deduce type of block if return is void casts to Proc(Nil) when specified in return type casts to Proc(Nil) when specified in return type disallows StaticArray in proc notation return type disallows StaticArray in proc notation return type doesn't cause upcast bug (#8428) doesn't cause upcast bug (#8428) disallows Float in proc pointer disallows Float in proc pointer types proc literal hard type inference (1) types proc literal hard type inference (1) allows implicit cast of proc to return void in LibC function allows implicit cast of proc to return void in LibC function disallows Float in proc notation return type disallows Float in proc notation return type disallows Int in procs disallows Int in procs sets proc type as void if explicitly told so, when using new sets proc type as void if explicitly told so, when using new errors if missing argument type in proc literal errors if missing argument type in proc literal types proc pointer to instance method types proc pointer to instance method allows metaclass in procs allows metaclass in procs allows writing a function type with Proc allows writing a function type with Proc disallows Struct in proc notation parameter type disallows Struct in proc notation parameter type disallows Reference in proc notation parameter type disallows Reference in proc notation parameter type disallows Struct in captured block disallows Struct in captured block 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) allows passing proc type if it is a lib alias allows passing proc type if it is a lib alias disallows Value in proc notation return type disallows Value in proc notation return type disallows Number in proc pointer disallows Number in proc pointer allows implicit cast of proc to return void in non-generic restriction allows implicit cast of proc to return void in non-generic restriction allows passing virtual type including module to proc allows passing virtual type including module to proc disallows Proc in proc notation parameter type disallows Proc in proc notation parameter type disallows Value in proc notation parameter type disallows Value in proc notation parameter type has proc literal as restriction and works when output not specified has proc literal as restriction and works when output not specified allows casting a proc type to one with void argument allows casting a proc type to one with void argument errors if inferred return type doesn't match return type restriction (1) errors if inferred return type doesn't match return type restriction (1) disallows Number in captured block disallows Number in captured block disallows Value in proc pointer disallows Value in proc pointer disallows Enum in proc return types disallows Enum in proc return types can match *T in block argument can match *T in block argument disallows Object in proc pointer disallows Object in proc pointer accesses T inside variadic generic, in proc notation accesses T inside variadic generic, in proc notation says wrong number of arguments says wrong number of arguments types proc literal with a type that was never instantiated types proc literal with a type that was never instantiated allows implicit cast of proc to return void in generic restriction allows implicit cast of proc to return void in generic restriction disallows Float in captured block disallows Float in captured block allows passing union including module to proc allows passing union including module to proc disallows Enum in procs disallows Enum in procs can use @ivar as pointer syntax receiver (#9239) can use @ivar as pointer syntax receiver (#9239) passes proc pointer as block with arguments passes proc pointer as block with arguments has proc literal as restriction and works has proc literal as restriction and works allows passing NoReturn type for any return type (1) allows passing NoReturn type for any return type (1) disallows Float in proc return types disallows Float in proc return types types proc call with return type types proc call with return type disallows Proc in proc pointer disallows Proc in proc pointer disallows Tuple in proc return types disallows Tuple in proc return types disallows Value in procs disallows Value in procs allows invoking a function with a generic subtype (1) allows invoking a function with a generic subtype (1) allows passing NoReturn type for any return type (2) allows passing NoReturn type for any return type (2) disallows Enum in proc notation return type disallows Enum in proc notation return type errors when using macro as proc value (inside method) (#7465) errors when using macro as proc value (inside method) (#7465) disallows Class in proc return types disallows Class in proc return types types empty proc literal types empty proc literal doesn't capture closured var if using typeof doesn't capture closured var if using typeof uses array argument of proc arg (1) uses array argument of proc arg (1) disallows Reference in proc pointer disallows Reference in proc pointer can pass proc that returns T as Void with named args (#7523) can pass proc that returns T as Void with named args (#7523) gives correct error message when proc return type is incorrect (#219) gives correct error message when proc return type is incorrect (#219) disallows casting a proc type to one accepting more arguments disallows casting a proc type to one accepting more arguments 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) *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) uses array argument of proc arg (3) uses array argument of proc arg (3) can assign NoReturn proc to other proc (#3032) can assign NoReturn proc to other proc (#3032) allows new on proc type that is a lib alias allows new on proc type that is a lib alias allows new on proc type with less block params allows new on proc type with less block params types int proc literal types int proc literal disallows Number in proc notation parameter type disallows Number in proc notation parameter type disallows Int in captured block disallows Int in captured block says wrong return type in new on proc type says wrong return type in new on proc type allows metaclass in proc notation parameter type allows metaclass in proc notation parameter type has proc literal as restriction and errors if sizes are different has proc literal as restriction and errors if sizes are different disallows Pointer in proc notation parameter type disallows Pointer in proc notation parameter type disallows Tuple in proc notation parameter type disallows Tuple in proc notation parameter type uses array argument of proc arg (2) uses array argument of proc arg (2) types a proc pointer with generic types types a proc pointer with generic types disallows Proc in procs disallows Proc in procs errors when using macro as proc value (top-level with obj) (#7465) errors when using macro as proc value (top-level with obj) (#7465) disallows Reference in proc return types disallows Reference in proc return types disallows Pointer in captured block disallows Pointer in captured block disallows StaticArray in captured block disallows StaticArray in captured block 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 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 Pointer in procs disallows Pointer in procs disallows Object in proc notation parameter type disallows Object in proc notation parameter type disallows Enum in proc notation parameter type disallows Enum in proc notation parameter type disallows Struct in proc pointer disallows Struct in proc pointer disallows Enum in proc pointer disallows Enum in proc pointer doesn't crash on constant to proc pointer doesn't crash on constant to proc pointer types proc literal with return type (1) types proc literal with return type (1) uses array argument of proc arg (4) uses array argument of proc arg (4) can pass Proc(T) to Proc(Nil) in type restriction (#8964) can pass Proc(T) to Proc(Nil) in type restriction (#8964) finds method of object finds method of object disallows Reference in proc notation return type disallows Reference in proc notation return type disallows Int in proc pointer disallows Int in proc pointer allows using Proc as restriction (3) allows using Proc as restriction (3) can assign proc that returns anything to proc that returns nil, with class var (#3655) can assign proc that returns anything to proc that returns nil, with class var (#3655) disallows StaticArray in procs disallows StaticArray in procs disallows Tuple in procs disallows Tuple in procs disallows Number in proc return types disallows Number in proc return types disallows StaticArray in proc return types disallows StaticArray in proc return types binds proc literal to arguments and body binds proc literal to arguments and body allows using proc arg name shadowing local variable allows using proc arg name shadowing local variable disallows Reference in captured block disallows Reference in captured block accesses T inside variadic generic accesses T inside variadic generic passes proc pointer as block passes proc pointer as block types int -> int proc literal types int -> int proc literal allows passing proc type if it is typedef'd allows passing proc type if it is typedef'd disallows Object in proc notation return type disallows Object in proc notation return type disallows StaticArray in proc pointer disallows StaticArray in proc pointer errors when using macro as proc value (top-level) (#7465) errors when using macro as proc value (top-level) (#7465) Lexer string lexes regex string with escaped slash with /.../ lexes regex string with escaped slash with /.../ lexes string with newline lexes string with newline says syntax error on "\"\\uD800\"" says syntax error on "\"\\uD800\"" lexes simple string with %| lexes simple string with %| lexes heredoc with \r\n lexes heredoc with \r\n lexes backtick string lexes backtick string raises on unterminated heredoc raises on unterminated heredoc lexes regex string lexes regex string lexes string with slash quote lexes string with slash quote lexes regex string with special chars with /.../ lexes regex string with special chars with /.../ says syntax error on "\"\\u{D800}\"" says syntax error on "\"\\u{D800}\"" lexes interpolations in heredocs lexes interpolations in heredocs lexes string with interpolation with double numeral lexes string with interpolation with double numeral lexes string with unicode codepoint lexes string with unicode codepoint lexes string with slash lexes string with slash lexes heredoc lexes heredoc lexes string with slash t lexes string with slash t raises on unexpected EOF while lexing heredoc raises on unexpected EOF while lexing heredoc lexes heredoc with spaces before close tag lexes heredoc with spaces before close tag lexes simple string lexes simple string lexes regex string with escaped space with /.../ lexes regex string with escaped space with /.../ lexes regex string with escaped space with %r(...) lexes regex string with escaped space with %r(...) says syntax error on "\"\\uFEDZ\"" says syntax error on "\"\\uFEDZ\"" lexes simple string with nested %[ lexes simple string with nested %[ lexes simple string with %( lexes simple string with %( says syntax error on "\"\\u{DFFF}\"" says syntax error on "\"\\u{DFFF}\"" lexes string with unicode codepoint in curly lexes string with unicode codepoint in curly lexes regex string with escaped slash with %r(...) lexes regex string with escaped slash with %r(...) lexes heredoc with empty line lexes heredoc with empty line lexes string with numeral lexes string with numeral lexes string with unicode codepoint in curly multiple times lexes string with unicode codepoint in curly multiple times lexes regex string with special chars with %r(...) lexes regex string with special chars with %r(...) lexes string with interpolation lexes string with interpolation lexes simple string with nested %< lexes simple string with nested %< says syntax error on "\"\\uDFFF\"" says syntax error on "\"\\uDFFF\"" says syntax error on "\"\\u{}\"" says syntax error on "\"\\u{}\"" lexes slash with no-escape char lexes slash with no-escape char lexes string with backslash lexes string with backslash lexes simple string with nested %( lexes simple string with nested %( assigns correct location after heredoc (#346) assigns correct location after heredoc (#346) lexes string with literal newline lexes string with literal newline raises when identifier doesn't start with a letter or number raises when identifier doesn't start with a letter or number says syntax error on "\"\\u{110000}\"" says syntax error on "\"\\u{110000}\"" lexes double numeral lexes double numeral lexes string with only newline lexes string with only newline lexes simple string with nested %{ lexes simple string with nested %{ Crystal::Playground::Session assert assert Crystal::Repl::Interpreter named tuple interprets named tuple literal and access by known index interprets named tuple literal and access by known index interprets named tuple metaclass indexer interprets named tuple metaclass indexer discards named tuple (#12383) discards named tuple (#12383) Crystal::Repl::Interpreter unions puts union inside union puts union inside union put and remove from union in instance var put and remove from union in instance var returns large union type (#15041) returns large union type (#15041) returns union type returns union type put and remove from union in local var put and remove from union in local var discards is_a? discards is_a? converts from NilableType to NonGenericClassType converts from NilableType to NonGenericClassType put and remove from union, together with is_a? (falsey case) put and remove from union, together with is_a? (falsey case) put and remove from union, together with is_a? (truthy case) put and remove from union, together with is_a? (truthy case) Code gen: splat splats with default value splats with default value splats on call splats on call splats splats splats with another arg splats with another arg splats with default value (2) splats with default value (2) splats in initialize splats in initialize splats without args splats without args does #2407 does #2407 splats with default value (3) splats with default value (3) evaluates splat argument just once (#2677) evaluates splat argument just once (#2677) Code gen: new inherits initialize inherits initialize evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) inherits initialize for generic type inherits initialize for generic type 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 overloads new and initialize, 2 (#2489) overloads new and initialize, 2 (#2489) overloads new and initialize, 3 (#2489) overloads new and initialize, 3 (#2489) finds new in superclass for Enum finds new in superclass for Enum defines new for module defines new for module can create Reference can create Reference overloads new and initialize, 1 (#2489) overloads new and initialize, 1 (#2489) 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 (1) (#731) evaluates initialize default value at the instance scope (1) (#731) finds new in superclass if no initialize is defined (1) finds new in superclass if no initialize is defined (1) codegens instance method with new and instance var codegens instance method with new and instance var codegens instance method with allocate codegens instance method with allocate finds super in deep hierarchy finds super in deep hierarchy codegens instance method with new codegens instance method with new finds new in superclass if no initialize is defined (2) finds new in superclass if no initialize is defined (2) Codegen: private codegens class var of private type with same name as public type (#11620) codegens class var of private type with same name as public type (#11620) codegens overloaded private def in same file codegens overloaded private def in same file codegens class vars of private types with same name (#11620) codegens class vars of private types with same name (#11620) codegens private def in same file codegens private def in same file doesn't include filename for private types doesn't include filename for private types Lexer: location pushes and pops its location pushes and pops its location overrides location with pragma overrides location with pragma locations with virtual files should be comparable locations with virtual files should be comparable stores line numbers stores line numbers stores column numbers stores column numbers locations in same files are comparable based on line locations in same files are comparable based on line uses two consecutive loc pragma uses two consecutive loc pragma Location.parse parses location from string parses location from string raises ArgumentError if column number is invalid raises ArgumentError if column number is invalid raises ArgumentError if missing part raises ArgumentError if missing part raises ArgumentError if missing colon raises ArgumentError if missing colon raises ArgumentError if line number is invalid raises ArgumentError if line number is invalid parses var/call right after loc (#491) parses var/call right after loc (#491) locations in different files have no order locations in different files have no order assigns correct loc location to node assigns correct loc location to node Code gen: void codegens void assignment codegens void assignment codegens unreachable code codegens unreachable code allows passing void as argument to method allows passing void as argument to method codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable codegens void assignment in case with local variable 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 returns void from nil functions, doesn't crash when passing value returns void from nil functions, doesn't crash when passing value codegens no return assignment codegens no return assignment semantic: case checks exhaustiveness for tuple literal with types and underscore at first position checks exhaustiveness for tuple literal with types and underscore at first position can't prove case is exhaustive for @[Flags] enum can't prove case is exhaustive for @[Flags] enum 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, covers in base type covers checks exhaustiveness, covers in base type covers checks exhaustiveness of enum via question method checks exhaustiveness of enum via question method checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of nilable type with nil literal checks exhaustiveness of nilable type with nil literal checks exhaustiveness of bool type with other types checks exhaustiveness of bool type with other types 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 of union with bool checks exhaustiveness of union with bool checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position covers all types covers all types checks exhaustiveness of union type with virtual type checks exhaustiveness of union type with virtual type checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness of enum combined with another type checks exhaustiveness of enum combined with another type 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 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, with partial match checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match checks exhaustiveness for tuple literal, and passes checks exhaustiveness for tuple literal, and passes checks exhaustiveness of bool type (missing false) checks exhaustiveness of bool type (missing false) checks exhaustiveness of single type checks exhaustiveness of single type checks exhaustiveness of single type (T.class) checks exhaustiveness of single type (T.class) checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness for tuple literal of 3 elements, all bool 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, and warns checks exhaustiveness for tuple literal of 3 elements, and warns checks exhaustiveness of enum (all cases covered) checks exhaustiveness of enum (all cases covered) checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal of 2 elements, first is enum checks exhaustiveness for tuple literal of 2 elements, first is enum checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position can prove case is exhaustive for @[Flags] enum when matching type can prove case is exhaustive for @[Flags] enum when matching type checks exhaustiveness of single type (generic) checks exhaustiveness of single type (generic) checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness of enum via const checks exhaustiveness of enum via const checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness for tuple literal of 2 elements, first is bool checks exhaustiveness for tuple literal of 2 elements, first is bool checks exhaustiveness of bool type (missing true) checks exhaustiveness of bool type (missing true) errors if casing against a constant errors if casing against a constant checks exhaustiveness of nil type with nil literal checks exhaustiveness of nil type with nil literal doesn't check exhaustiveness when using 'when' doesn't check exhaustiveness when using 'when' Semantic: abstract def errors if implementation doesn't match splat type errors if implementation doesn't match splat type errors if using abstract def on non-abstract class errors if using abstract def on non-abstract class doesn't error if implementation have default value doesn't error if implementation have default value 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 errors if implementation adds type restriction errors if implementation adds type restriction errors if double splat type doesn't match errors if double splat type doesn't match finds implements in included module in disorder (#4052) finds implements in included module in disorder (#4052) errors if different return type errors if different return type doesn't error if implements with parent module doesn't error if implements with parent module 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 implements with generic parent class instance doesn't error if implements with generic parent class instance errors if implementation doesn't have default value errors if implementation doesn't have default value 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) errors if implementation doesn't have the same default value errors if implementation doesn't have the same default value doesn't error if implementation has more keyword arguments with default values doesn't error if implementation has more keyword arguments with default values matches generic module matches generic module errors if implementation misses the double splat errors if implementation misses the double splat allow splat instead of keyword argument allow splat instead of 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) errors if can't find child return type errors if can't find child return type errors if missing a return type in subclass of generic subclass errors if missing a return type in subclass of generic subclass errors if using abstract def on metaclass errors if using abstract def on metaclass doesn't error with splat doesn't error with 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 is implemented by subclass doesn't error if abstract method is implemented by subclass doesn't error if implementation matches keyword argument doesn't error if implementation matches keyword argument 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 errors if implementation has more keyword arguments errors if implementation has more keyword arguments doesn't error if implements with generic included module instance doesn't error if implements with generic included module instance doesn't error if implements a NoReturn param doesn't error if implements a NoReturn param doesn't error if abstract method with args is implemented by subclass (with one default arg) doesn't error if abstract method with args is implemented by subclass (with one default arg) errors if implementation doesn't have a splat errors if implementation doesn't have a splat can implement even if yield comes later in macro code can implement even if yield comes later in macro code implementation is not inherited from supertype generic class generic class nongeneric class nongeneric class nongeneric module nongeneric module generic module generic module 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 implements through extend (considers original type for generic lookup) (#8096) implements through extend (considers original type for generic lookup) (#8096) matches instantiated generic module matches instantiated generic module double splat must match keyword argument type double splat must match keyword argument type doesn't error if abstract method is implemented by including class doesn't error if abstract method is implemented by including class matches instantiated generic types matches instantiated generic types errors if missing return type errors if missing return type doesn't error if implementation have keyword arguments in different order doesn't error if implementation have keyword arguments in different order 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 allow double splat argument allow double splat argument matches generic module (a bit more complex) matches generic module (a bit more complex) doesn't error with splat and args with default value doesn't error with splat and args with default value matches generic types matches generic types works on abstract method on abstract class works on abstract method on abstract class errors if abstract method is not implemented by subclass (nested in module) errors if abstract method is not implemented by subclass (nested in module) extra keyword arguments must have compatible type to double splat extra keyword arguments must have compatible type to double splat errors if can't find parent return type errors if can't find parent return type errors if using abstract def on subclass errors if using abstract def on subclass errors if implementation doesn't match keyword argument type errors if implementation doesn't match keyword argument type works on abstract def on sub-subclass works on abstract def on sub-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 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) allows arguments to be collapsed into splat allows arguments to be collapsed into splat allow double splat when abstract doesn't have it allow double splat when abstract doesn't have it errors if implementation doesn't have keyword arguments errors if implementation doesn't have keyword arguments errors if keyword argument doesn't have the same default value errors if keyword argument doesn't have the same default value doesn't error if implements with parent class doesn't error if implements with parent class errors if abstract method is not implemented by subclass errors if abstract method is not implemented by subclass 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) errors if abstract method with arguments is not implemented by subclass errors if abstract method with arguments is not implemented by subclass 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) can return a more specific type can return a more specific type matches generic return type matches generic return type 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) implements through extend (considers original type for generic lookup) (2) (#8096) implements through extend (considers original type for generic lookup) (2) (#8096) 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 subclass of subclass errors if abstract method is not implemented by subclass of subclass errors if abstract method is not implemented by including class errors if abstract method is not implemented by including class error shows full signature of block parameter error shows full signature of block parameter 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) doesn't error if implements with included module doesn't error if implements with included module Normalize: and normalizes and with assignment normalizes and with assignment normalizes and with is_a? on exp normalizes and with is_a? on exp normalizes and without variable normalizes and without variable normalizes and with variable on the left normalizes and with variable on the left normalizes and with ! on var normalizes and with ! on var normalizes and with ! on var.is_a?(...) normalizes and with ! on var.is_a?(...) normalizes and with is_a? on var normalizes and with is_a? on var Crystal::Repl::Interpreter blocks interprets yield inside another block interprets yield inside another block interprets yield with splat, block with splat interprets yield with splat, block with splat interprets next inside block interprets next inside block discards yield expression discards yield expression interprets next inside block (union, through next) interprets next inside block (union, through next) interprets with ... yield with extra arguments (#12296) interprets with ... yield with extra arguments (#12296) interprets yield return value interprets yield return value interprets yield with splat (2) interprets yield with splat (2) interprets yield with splat, less block arguments interprets yield with splat, less block arguments interprets break inside block (union, through normal flow) interprets break inside block (union, through normal flow) counts with ... yield scope in block args bytesize (#12316) counts with ... yield scope in block args bytesize (#12316) caches method with captured block (#12276) caches method with captured block (#12276) interprets break inside block (union, through break) interprets break inside block (union, through break) interprets yield inside def with arguments interprets yield inside def with arguments interprets yield with splat (1) interprets yield with splat (1) interprets with ... yield interprets with ... yield interprets break inside block (union, through return) interprets break inside block (union, through return) interprets yield expression interprets yield expression clears block local variables when calling block clears block local variables when calling block interprets yield expressions interprets yield expressions considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (#12270) considers block arg without type as having NoReturn type (#12270) interprets yield with splat, block with splat (#12227) interprets yield with splat, block with splat (#12227) interprets with ... yield with struct interprets with ... yield with struct interprets block with multiple yields interprets block with multiple yields interprets simplest block interprets simplest block interprets break inside block interprets break inside block clears block local variables when calling block (2) clears block local variables when calling block (2) interprets block with args that conflict with a local var interprets block with args that conflict with a local var returns from block returns from block interprets block with splat interprets block with splat yields different values to form a union yields different values to form a union interprets next inside block (union, through normal exit) interprets next inside block (union, through normal exit) captures non-closure block captures non-closure block casts yield expression to block var type (not block arg type) casts yield expression to block var type (not block arg type) interprets block with args that conflict with a local var interprets block with args that conflict with a local var Code gen: or 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 nil union as left node 2 codegens or with nil union as left node 2 codegens or with nil union as left node 1 codegens or with nil 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 false and false codegens or with bool false and false codegens or with bool union as left node 2 codegens or with bool union as left node 2 codegens or with bool union as left node 3 codegens or with bool union as left node 3 codegens or with primitive type other than bool codegens or with primitive type other than bool codegens or with bool union as left node 2 codegens or with bool union as left node 2 codegens or with bool and int 2 codegens or with bool and int 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 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 non-false union as left node codegens or with non-false union as left node codegens or with bool true and true codegens or with bool true and true codegens or with bool false and true codegens or with bool false and true codegens or with bool union as left node 1 codegens or with bool union as left node 1 codegens or with bool and int 1 codegens or with bool and int 1 codegens or with nilable as left node 1 codegens or with nilable as left node 1 codegens or with bool true and false codegens or with bool true and false Crystal::Repl::Interpreter bugs breaks from current block, not from outer block breaks from current block, not from outer block correctly puts virtual metaclass type in union correctly puts virtual metaclass type in union does multidispatch on virtual struct does multidispatch on virtual struct does multidispatch on virtual struct union nil does multidispatch on virtual struct union nil does leading zeros does leading zeros doesn't override local variable value with block var with the same name doesn't override local variable value with block var with the same name doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method doesn't pass self to top-level method doesn't incorrectly consider a non-closure as closure doesn't incorrectly consider a non-closure as closure Semantic: struct 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 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 doesn't make virtual for Int doesn't make virtual for Int types struct declaration types struct declaration unifies type to virtual type unifies type to virtual type can cast to base abstract struct can cast to base abstract struct types generic struct declaration types generic struct declaration doesn't make virtual for Struct doesn't make virtual for Struct doesn't make virtual for Value doesn't make virtual for Value passes subtype check with generic module type on virtual type passes subtype check with generic module type on virtual type passes subtype check with generic module type on virtual type (2) (#10302) passes subtype check with generic module type on virtual type (2) (#10302) doesn't make virtual for Float doesn't make virtual for Float can't be nilable can't be nilable can't reopen as class can't reopen as class passes subtype check with generic module type on virtual type (3) passes subtype check with generic module type on virtual type (3) can't extend struct from class can't extend struct from class errors if defining finalize for struct (#3840) errors if defining finalize for struct (#3840) can't extend struct from non-abstract struct can't extend struct from non-abstract struct Semantic: initialize 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 inside typeof doesn't type instance var as nilable if used after method call inside typeof doesn't type instance var as nilable if not used in method call doesn't type instance var as nilable if not used in method call types instance var as non-nilable if calls super and super defines it types instance var as non-nilable if calls super and super defines it types instance vars as nilable if doesn't invoke super in initialize with deep subclass types instance vars as nilable if doesn't invoke super in initialize with deep subclass doesn't type instance var as nilable if used after method call that doesn't read var doesn't type instance var as nilable if used after method call that doesn't read var doesn't type instance var as nilable if used after global method call doesn't type instance var as nilable if used after global method call types initializer of recursive generic type types initializer of recursive generic type 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 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 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 var as nilable if used before assignment types instance var as nilable if used before assignment 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 marks instance variable as nilable in initialize if assigning self marks instance variable as nilable in initialize if assigning self types instance var as nilable if not always assigned types instance var as nilable if not always assigned doesn't type instance var as nilable if out doesn't type instance var as nilable if out types instance var as nilable if assigned in block types instance var as nilable if assigned in block 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 with default arguments types instance vars as nilable if doesn't invoke super with default arguments types initializer of generic type after instantiated types initializer of generic type after instantiated marks instance variable as nilable in initialize if using self marks instance variable as nilable in initialize if using self checks instance vars of included modules checks instance vars of included modules errors on default new when using named arguments (#2245) errors on default new when using named arguments (#2245) 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 vars as nilable if doesn't invoke super in initialize types instance vars as nilable if doesn't invoke super in initialize 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 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 (2) types instance var as nilable if used after method call that reads var (2) finishes when analyzing recursive calls finishes when analyzing recursive calls marks instance variable as nilable when using self in super marks instance variable as nilable when using self in super doesn't type instance var as nilable if assigned before method call doesn't type instance var as nilable if assigned before method call types instance var as 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 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 Block inference errors if proc is not instantiated errors if proc is not instantiated errors on recursive yield with ProcNotation restriction errors on recursive yield with ProcNotation restriction auto-unpacks tuple auto-unpacks tuple errors if using Object as block return type (#2358) errors if using Object as block return type (#2358) doesn't auto-unpack tuple, more args doesn't auto-unpack tuple, more args error with self input type doesn't match error with self input type doesn't match reports mismatch with generic argument type in input type reports mismatch with generic argument type in input type 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 checks block type with virtual type checks block type with virtual type auto-unpacks tuple, captured block auto-unpacks tuple, captured block infer type of local variable infer type of local variable binds to proc, not only to its body (#1796) binds to proc, not only to its body (#1796) errors if declares def inside block errors if declares def inside block auto-unpacks tuple, less than max, captured block auto-unpacks tuple, less than max, captured block reports error if missing arguments to yield reports error if missing arguments to yield uses splat in block parameter, but not enough yield expressions uses splat in block parameter, but not enough yield expressions respects block arg restriction when block has a splat parameter (#6473) respects block arg restriction when block has a splat parameter (#6473) infer type with union infer type with union uses splat in block parameter uses splat in block parameter recalculates call that uses block arg output as free var recalculates call that uses block arg output as free var allows alias as block fun type allows alias as block fun type errors if breaks from captured block errors if breaks from captured 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 uses block var with same name as local var uses block var with same name as local var matches block with generic type and free var matches block with generic type and free var errors if declares class inside block errors if declares class inside block ignores void return type (2) (#427) ignores void return type (2) (#427) errors if using (Object ->) as block return type (#2358) errors if using (Object ->) as block return type (#2358) passes &->f passes &->f allows yielding multiple types when a union is expected allows yielding multiple types when a union is expected 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 on recursive yield with non ProcNotation restriction (#6896) errors on recursive yield with non ProcNotation restriction (#6896) ignores void return type (#427) ignores void return type (#427) auto-unpacks tuple, captured block with multiple statements auto-unpacks tuple, captured block with multiple statements yields with different types yields with different types reports error if block type doesn't match reports error if block type doesn't match types recursive hash assignment types recursive hash assignment auto-unpacks with block arg type auto-unpacks with block arg type errors if invoking new with block when no initialize is defined errors if invoking new with block when no initialize is defined yields splat yields splat does next from block with value does next from block with value passes #262 passes #262 errors if declares extend inside block errors if declares extend inside block respects block arg restriction when block has a splat parameter (2) (#9524) respects block arg restriction when block has a splat parameter (2) (#9524) errors if alias is not a fun type errors if alias is not a fun type 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 error with self output type doesn't match error with self output type doesn't match uses block arg, too many parameters uses block arg, too many parameters doesn't mix local var with block var, using break (#2314) doesn't mix local var with block var, using break (#2314) auto-unpacks tuple, captured empty block auto-unpacks tuple, captured empty 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 maps block of union types to union types maps block of union types to union types types empty block types empty block errors if declares lib inside block errors if declares lib inside block break without value has nil type break without value has nil type infer type with self block arg infer type with self block arg ignores block parameter if not used ignores block parameter if not used doesn't crash on #2531 doesn't crash on #2531 errors if splat parameter becomes a union errors if splat parameter becomes a union correctly types unpacked tuple block arg after block (#3339) correctly types unpacked tuple block arg after block (#3339) doesn't assign block variable type to last value (#694) doesn't assign block variable type to last value (#694) uses free var in return type with tuple type uses free var in return type with tuple type doesn't fail with 'already had enclosing call' (#11200) doesn't fail with 'already had enclosing call' (#11200) uses splat in block parameter, many args uses splat in block parameter, many args infer type of empty block body infer type of empty block body types bug with yield not_nil! that is never not nil types bug with yield not_nil! that is never not nil 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) reports error on method instantiate (#4543) reports error on method instantiate (#4543) auto-unpacks tuple, less than max auto-unpacks tuple, less than max returns from proc literal returns from proc literal errors if declares module inside block errors if declares module inside block ignores void return type (4) ignores void return type (4) ignores void return type (3) (#427) ignores void return type (3) (#427) errors if using ( -> Object) as block return type (#2358) errors if using ( -> Object) as block return type (#2358) does next from captured block does next from captured block finds type inside module in block finds type inside module in block matches block arg return type matches block arg return type yields in overload, matches type yields in overload, matches type infer type of block parameter infer type of block parameter passes #233: block with initialize with default args passes #233: block with initialize with default args errors if declares class inside captured block errors if declares class inside captured block allows initialize with yield (#224) allows initialize with yield (#224) reports mismatch with generic argument type in output type reports mismatch with generic argument type in output type uses free var in return type in captured block uses free var in return type in captured block errors if declares alias inside block errors if declares alias inside block errors if declares fun inside block errors if declares fun inside block errors if declares enum inside block errors if declares enum inside block errors if returns from captured block errors if returns from captured block 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 doesn't crash on cleaning up typeof node without dependencies (#8669) doesn't crash on cleaning up typeof node without dependencies (#8669) errors if declares include inside block errors if declares include 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 using Bar | Object as block return type (#2358) errors if using Bar | Object as block return type (#2358) infer type of block body infer type of block body unpacks block argument unpacks block argument reports error if block didn't return expected type reports error if block didn't return expected type errors on recursive yield errors on recursive yield errors if doing next in proc literal errors if doing next in proc literal auto-unpacks tuple, too many args auto-unpacks tuple, too many args auto-unpacks tuple, too many args, captured block auto-unpacks tuple, too many args, captured block sets captured block type to that of restriction with alias sets captured block type to that of restriction with alias does next from block with value 2 does next from block with value 2 errors when using local variable with block parameter name errors when using local variable with block parameter name infer type of yield infer type of yield break from block without value break from block without value yields splat and non splat yields splat and non splat does next from block without value does next from block without value 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) errors if yields from top level errors if yields from top level infers type of block with generic type infers type of block with generic type infers type of block before call infers type of block before call preserves type filters in block preserves type filters in block doesn't mix local var with block var, using next (#2314) doesn't mix local var with block var, using next (#2314) errors if declares macro inside block errors if declares macro inside block reports error if block changes type reports error if block changes type sets captured block type to that of restriction sets captured block type to that of restriction renders expected block return type of a free variable on mismatch renders expected block return type of a free variable on mismatch Semantic: const can use constant defined later (#2906) can use constant defined later (#2906) doesn't crash with const used in initialize (bug) doesn't crash with const used in initialize (bug) doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") finds const from restriction finds const from restriction errors if using const in type declaration errors if using const in type declaration types a global constant reference in method types a global constant reference in method doesn't errors if constant depends on another one defined later through method, but constant is simple (1 &+ ZED) 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 (ZED &- 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &- 1) doesn't share variables with global scope doesn't share variables with global scope 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 (1 + ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) errors on dynamic constant assignment inside block errors on dynamic constant assignment inside block doesn't errors if constant depends on another one defined later through method, but constant is simple (+ 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (+ 1) 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) 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 (nil) 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 ('a') doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') errors if can't infer constant type (#3240, #3948) errors if can't infer constant type (#3240, #3948) 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) 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 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 (ZED &* 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED &* 2) finds current type only for first path item (2) finds current type only for first path item (2) errors if using const in proc notation parameter type errors if using const in proc notation parameter type types a constant reference types a constant reference errors if using const in proc notation return type errors if using const in proc notation return type creates container module if not exist when using Path creates container module if not exist when using Path finds current type before parents (#4086) finds current type before parents (#4086) finds current type only for first path item (1) finds current type only for first path item (1) errors if using constant as generic type (#3240) errors if using constant as generic type (#3240) finds constant in class that extends class (#205) finds constant in class that extends class (#205) types a nested type with same name types a nested type with same name 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) types a constant inside a def types a constant inside a def types a constant types a constant finds current type first finds current type first finds constant in module that includes module (#205) finds constant in module that includes module (#205) types a nested constant using Path types a nested constant using Path doesn't error if using c enum doesn't error if using c enum errors on dynamic constant assignment inside if errors on dynamic constant assignment inside if errors if using return inside constant value (#5391) errors if using return inside constant value (#5391) errors if using const in restriction errors if using const in restriction doesn't count parent types as current type doesn't count parent types as current type doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) types a global constant reference in static method types a global constant reference in static method 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) finds nearest constant first finds nearest constant first 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) errors if constant has NoReturn type (#6139) errors if constant has NoReturn type (#6139) keeps type of container when using Path keeps type of container when using Path errors if using const in var declaration errors if using const in var declaration Normalize: string interpolation normalizes string interpolation normalizes string interpolation normalizes heredoc normalizes heredoc replaces string constant replaces string constant replaces string constant that results from macro expansion replaces string constant that results from macro expansion normalizes string interpolation with multiple lines normalizes string interpolation with multiple lines replaces through multiple levels replaces through multiple levels Semantic: virtual works with restriction alpha works with restriction alpha restricts with union and doesn't merge to super type restricts with union and doesn't merge to super type types method call of virtual type with override types method call of virtual type with override reports missing cover for subclass of abstract class reports missing cover for subclass of abstract class types class and two subclasses types class and two subclasses reports no matches for virtual type reports no matches for virtual type dispatches virtual method with overload dispatches virtual method with overload types inspect types inspect checks cover in every concrete subclass 3 checks cover in every concrete subclass 3 reports undefined method in subclass of abstract class reports undefined method in subclass of abstract class checks cover in every concrete subclass 2 checks cover in every concrete subclass 2 doesn't check cover for abstract classes doesn't check cover for abstract classes types two classes without a shared virtual types two classes without a shared virtual doesn't check methods on abstract classes doesn't check methods on abstract classes checks method in every concrete subclass but method in Object checks method in every concrete subclass but method in Object finds overloads of union of virtual, class and nil finds overloads of union of virtual, class and nil checks cover in every concrete subclass checks cover in every concrete subclass automatically does virtual for generic type if there are subclasses automatically does virtual for generic type if there are subclasses doesn't check cover for subclasses doesn't check cover for subclasses types instance var as virtual when using type declaration and has subclasses types instance var as virtual when using type declaration and has subclasses types two subclasses types two subclasses uses virtual type as generic type if class is abstract uses virtual type as generic type if class is abstract 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 removes instance var from subclasses removes instance var from subclasses types class and subclass as one type types class and subclass as one type finds overloads of union of virtual, class and nil with abstract class finds overloads of union of virtual, class and nil with abstract class dispatches virtual method dispatches virtual method types method call of virtual type types method call of virtual type doesn't check methods on abstract classes 2 doesn't check methods on abstract classes 2 Lexer comments lexes with comments enabled (2) lexes with comments enabled (2) lexes correct number of spaces lexes correct number of spaces lexes without comments enabled lexes without comments enabled lexes with comments enabled lexes with comments enabled Crystal::Doc::Type #macros sorts operators first sorts operators first doesn't show types for alias type doesn't show types for alias type ASTNode has no ancestors ASTNode has no ancestors ASTNode has no superclass ASTNode has no superclass #class_methods sorts operators first sorts operators first #instance_methods sorts operators first sorts operators first finds construct when searching class method (#8095) finds construct when searching class method (#8095) #node_to_html shows generic path with unnecessary colons shows generic path with unnecessary colons shows tuples shows tuples shows named tuples shows named tuples shows generic path with necessary colons shows generic path with necessary colons shows relative path shows relative path shows relative generic shows relative generic Restrictions restricts aliased typedef type (#9474) restricts aliased typedef type (#9474) works with static array that uses underscore works with static array that uses underscore errors if using NamedTuple with positional args errors if using NamedTuple with positional args 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) doesn't error if using NamedTuple with no args doesn't error if using NamedTuple with no args restricts class union type to overloads with classes (2) restricts class union type to overloads with classes (2) works with static array (#637) works with static array (#637) passes #278 passes #278 errors if using typeof in block restriction errors if using typeof in block restriction restricts class union type to overloads with classes restricts class union type to overloads with classes errors if can't find type on lookup with nested type errors if can't find type on lookup with nested type errors if using Tuple with named args errors if using Tuple with named args restricts virtual metaclass type against metaclass (#3438) restricts virtual metaclass type against metaclass (#3438) doesn't error if using Tuple with no args doesn't error if using Tuple with no args errors if can't find type on lookup errors if can't find type on lookup 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 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) matches alias against alias in block type matches alias against alias in block type restrict restricts type with another type restricts type with another type restricts virtual type with included module 2 restricts virtual type with included module 2 restricts generic module instance with another module restricts generic module instance with another module restricts generic module instance with another generic module instance restricts generic module instance with another generic module instance restricts module with another module restricts module with another module restricts type with same type restricts type with same type restricts module through generic include (#4287) restricts module through generic include (#4287) restricts generic module instance with class restricts generic module instance with class restricts virtual generic class against uninstantiated generic subclass (1) restricts virtual generic class against uninstantiated generic subclass (1) restricts virtual generic class against uninstantiated generic subclass (2) restricts virtual generic class against uninstantiated generic subclass (2) restricts type with superclass restricts type with superclass 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 type with included module restricts type with included module 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 virtual type with included module 1 restricts virtual type with included module 1 matches free variable for type variable matches free variable for type variable makes metaclass subclass pass parent metaclass restriction (#2079) makes metaclass subclass pass parent metaclass restriction (#2079) works with union against unions of generics works with union against unions of generics matches number in bound free variable (#13605) matches number in bound free variable (#13605) errors if using typeof errors if using typeof errors if using typeof in block restriction errors if using typeof in block restriction restriction_of? Metaclass vs Path keeps metaclass before Object keeps metaclass before Object inserts metaclass before Object inserts metaclass before Object 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) keeps metaclass before Class keeps metaclass before Class 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) inserts metaclass before Class inserts metaclass before Class keeps metaclass before Value keeps metaclass before Value inserts metaclass before Value inserts metaclass before Value 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 Union handles redefinitions (1) (#12330) handles redefinitions (1) (#12330) handles redefinitions (2) (#12330) handles redefinitions (2) (#12330) orders union before generic (#12330) orders union before generic (#12330) 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 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 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 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 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 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 GenericClassType vs GenericClassInstanceType works with classes in different namespaces works with classes in different namespaces inserts GenericClassInstanceType before GenericClassType inserts GenericClassInstanceType before GenericClassType keeps GenericClassInstanceType before GenericClassType keeps GenericClassInstanceType before GenericClassType doesn't mix different generic classes doesn't mix different generic classes 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 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 Underscore vs Path keeps underscore after Path (#12854) keeps underscore after Path (#12854) works with splats and modules, under -Dpreview_overload_order (#12854) works with splats and modules, under -Dpreview_overload_order (#12854) inserts Path before underscore (#12854) inserts Path before underscore (#12854) Generic vs 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) keeps untyped Generic before untyped Path keeps untyped Generic before untyped Path keeps typed Generic before untyped Path keeps typed Generic before untyped Path inserts untyped Generic before untyped Path inserts untyped Generic before untyped Path works with generic compared to fixed (primitive) type works with generic compared to fixed (primitive) type matches virtual type against alias matches virtual type against alias sets number as unbound generic type var (#13110) sets number as unbound generic type var (#13110) allows passing recursive type to free var (#1076) allows passing recursive type to free var (#1076) should not let GenericChild(Base) pass as a GenericBase(Child) (#1294) should not let GenericChild(Base) pass as a GenericBase(Child) (#1294) sets number as free variable (#2699) sets number as free variable (#2699) errors on T::Type that's union when used from type restriction errors on T::Type that's union when used from type restriction self always matches instance type in return type self always matches instance type in return type errors if using typeof inside generic type errors if using typeof inside generic type errors if using free var without forall errors if using free var without forall works with generic class metaclass vs. generic instance class metaclass works with generic class metaclass vs. generic instance class metaclass self always matches instance type in restriction self always matches instance type in restriction Crystal::Doc::ProjectInfo .find_source_url_pattern .find_source_url_pattern #fill_with_defaults no shard.yml, but git tagged version no shard.yml, but git tagged version with shard.yml git but no commit git but no commit not in a git folder not in a git folder git tagged version git tagged version git missing git missing git untracked file doesn't prevent detection git untracked file doesn't prevent detection git tagged version dirty git tagged version dirty git non-tagged commit git non-tagged commit git non-tagged commit dirty git non-tagged commit dirty git with remote git with remote empty folder empty folder .read_shard_properties indented properties indented properties duplicate properties uses first one duplicate properties uses first one empty properties empty properties name and version name and version only name only name strip quotes strip quotes without name and version properties without name and version properties ignores comments ignores comments strip whitespace strip whitespace no shard.yml no shard.yml .git_remote origin plus other origin plus other no remote no remote simple origin simple origin no origin remote no origin remote no git workdir no git workdir .find_git_version .find_git_version #source_url builds url builds url fails if pattern is missing fails if pattern is missing fails if pattern is missing fails if pattern is missing fails if refname is missing fails if refname is missing returns nil for empty pattern returns nil for empty pattern builds url builds url Semantic: did you mean says did you mean for global method without parenthesis says did you mean for global method without parenthesis says did you mean for two mistakes in long word in instance method says did you mean for two mistakes in long word in instance method suggest that there might be a typo for an initialize method in inherited class suggest that there might be a typo for an initialize method in inherited class says did you mean for one mistake in short word in instance method says did you mean for one mistake in short word in instance method says did you mean for instance var says did you mean for instance var says did you mean for class says did you mean for class suggests for class variable suggests for class variable says did you mean in instance var declaration says did you mean in instance var declaration doesn't suggest when declaring var inside macro (#466) doesn't suggest when declaring var inside macro (#466) says did you mean for global method with parenthesis says did you mean for global method with parenthesis doesn't suggest when declaring var with suffix if and using it (#946) doesn't suggest when declaring var with suffix if and using it (#946) says did you mean for variable says did you mean for variable says did you mean finds most similar in type says did you mean finds most similar in type suggest that there might be a typo for an initialize method with overload suggest that there might be a typo for an initialize method with overload suggest that there might be a typo for an initialize method suggest that there might be a typo for an initialize method says did you mean for named argument says did you mean for named argument says did you mean finds most similar in def says did you mean finds most similar in def doesn't suggest for operator doesn't suggest for operator says did you mean for instance var in subclass says did you mean for instance var in subclass suggests a better alternative to logical operators (#2715) suggests a better alternative to logical operators (#2715) says did you mean for nested class says did you mean for nested class 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: hash literal spec 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 non-generic hash in module creates custom non-generic hash in module 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 non-generic hash creates custom non-generic hash creates custom generic hash with type vars creates custom generic hash with type vars creates custom generic hash creates custom generic hash creates custom generic hash in module (#5684) creates custom generic hash in module (#5684) 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) creates custom generic hash via alias (1) creates custom generic hash via alias (1) creates custom generic hash via alias (2) creates custom generic hash via alias (2) Code gen: union type respects union payload alignment when upcasting Bool (#14898) respects union payload alignment when upcasting Bool (#14898) codegens union type when obj is union and arg is union codegens union type when obj is union and arg is union codegens union type when no obj and restrictions codegens union type when no obj and restrictions codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union to_s codegens union type when obj union but arg is not codegens union type when obj union but arg is not assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union assigns union to larger union dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable dispatch call to object method on nilable codegens union type as return value codegens union type as return value codegens union type when obj is not union but arg is codegens union type when obj is not union but arg is codegens union type when obj is union and no args codegens union type when obj is union and no args assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union codegens if with same nested union codegens if with same nested union assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 assigns union to larger union when source is nilable 2 codegens union type for instance var codegens union type for instance var sorts restrictions when there are unions sorts restrictions when there are unions assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 assigns union to larger union when source is nilable 1 provides T as a tuple literal provides T as a tuple literal codegens union type when no obj codegens union type when no obj Code gen: C ABI 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 between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) passes struct between 64 and 128 bits (for real) returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret returns struct bigger than 128 bits with sret 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) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) returns struct 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) 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 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 (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) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) promotes variadic args (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) 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) Crystal::Doc::Macro args_to_s shows simple args shows simple args shows default value with highlighting shows default value with highlighting shows simple arg and block arg shows simple arg and block 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 external name of arg shows external name of arg shows simple arg and double splat arg shows simple arg and double splat arg shows block arg shows block arg shows simple arg and splat arg shows simple arg and splat arg shows double splat arg shows double splat arg shows splat arg shows splat arg MacroExpander expands macro with symbol expands macro with symbol expands macro with nil expands macro with nil expands macro with hash expands macro with hash expands macro with string expands macro with string expands macro with string substitution expands macro with string substitution does not expand when macro expression is {% ... %} does not expand when macro expression is {% ... %} expands macro with and (2) expands macro with and (2) if expands macro with if when falsey expands macro with if when falsey expands macro with if else when falsey expands macro with if else when falsey expands macro with if with nop expands macro with if with nop expands macro with if with not expands macro with if with not expands macro with if when truthy expands macro with if when truthy outputs invisible location pragmas outputs invisible location pragmas expands macro with array expands macro with array expands macro with or (1) expands macro with or (1) expands macro with integer expands macro with integer does regular unless does regular unless expands macro with string interpolation expands macro with string interpolation expands simple macro expands simple macro expands macro with and (1) expands macro with and (1) expands macro with symbol substitution expands macro with symbol substitution expands macro with char expands macro with char does regular if does regular if expands macro with boolean expands macro with boolean can't use `yield` outside a macro can't use `yield` outside a macro expands macro with tuple expands macro with tuple expands macro with range expands macro with range expands macro with var substitution expands macro with var substitution for expands macro with for over hash literal with index expands macro with for over hash literal with index expands macro with for over array literal with index expands macro with for over array literal with index expands macro with for over range literal expands macro with for over range literal expands macro with for over array literal expands macro with for over array literal expands macro with for over embedded array literal expands macro with for over embedded array literal expands macro with for over range literal, evaluating elements (exclusive) expands macro with for over range literal, evaluating elements (exclusive) expands macro with for over hash literal expands macro with for over hash literal expands macro with for over range literal, evaluating elements expands macro with for over range literal, evaluating elements expands macro with for over tuple literal expands macro with for over tuple literal expands macro with or (2) expands macro with or (2) expands macro with argument-less call substitution expands macro with argument-less call substitution Code gen: nilable cast does cast to nil (2) does cast to nil (2) types as? with wrong type (#2775) types as? with wrong type (#2775) does cast to nil (1) does cast to nil (1) codegens with NoReturn codegens with NoReturn does nilable cast (true) does nilable cast (true) does nilable cast (false) does nilable cast (false) casts with block var that changes type (#3341) casts with block var that changes type (#3341) casts union type to nilable type (#9342) casts union type to nilable type (#9342) does upcast does upcast does nilable cast (always true) does nilable cast (always true) upcasts type to virtual (#3304) upcasts type to virtual (#3304) upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) Semantic: restrictions augmenter augments relative private type in same namespace augments relative private type in same namespace augments recursive alias type (#12134) augments recursive alias type (#12134) augments Char augments Char augments Pointer(Void) augments Pointer(Void) augments Proc(Int32, Nil) augments Proc(Int32, Nil) augments Int32.class augments Int32.class augments Enumerable(Int32).class augments Enumerable(Int32).class augments Char | Int32 | String augments Char | Int32 | String augments Char | Int32 | String augments Char | Int32 | String augments relative public type augments relative public type augments NamedTuple(a: Int32, b: Char) augments NamedTuple(a: Int32, b: Char) augments typedef augments typedef augments Int32 augments Int32 doesn't crash on macro that yields and defines class (#12142) doesn't crash on macro that yields and defines class (#12142) augments type splat augments type splat augments Float32 augments Float32 augments Array(Int32).class augments Array(Int32).class augments virtual metaclass type augments virtual metaclass type augments virtual type augments virtual type augments relative private type augments relative private type augments String augments String augments Tuple(Int32, Char) augments Tuple(Int32, Char) doesn't augment if assigned inside block doesn't augment if assigned inside block doesn't augment if the no_restrictions_augmenter flag is present doesn't augment if the no_restrictions_augmenter flag is present doesn't augment if assigned inside if doesn't augment if assigned inside if augments generic uninstantiated type augments generic uninstantiated type augments Nil augments Nil augments Proc(Int32, Char) augments Proc(Int32, Char) augments Array(String) augments Array(String) augments for class var augments for class var augments for Union(*T) (#12435) augments for Union(*T) (#12435) augments StaticArray(Int32, 8) augments StaticArray(Int32, 8) augments Bool augments Bool augments NoReturn augments NoReturn augments Symbol augments Symbol doesn't augment if assigned inside while doesn't augment if assigned inside while Semantic: named tuples types nilable named tuple access (4) types nilable named tuple access (4) matches in type restriction matches in type restriction types named tuple of two elements types named tuple of two elements types nilable named tuple access (5) types nilable named tuple access (5) doesn't crash on named tuple type recursion (#7162) doesn't crash on named tuple type recursion (#7162) doesn't error if NamedTuple has no args doesn't error if NamedTuple has no args allows tuple covariance allows tuple covariance types nilable named tuple access (2) types nilable named tuple access (2) doesn't crash on named tuple in not executed block (#6718) doesn't crash on named tuple in not executed block (#6718) matches in type restriction and gets free var matches in type restriction and gets free var merges two named tuples with the same keys and types merges two named tuples with the same keys and types merges two named tuple with same keys but different types merges two named tuple with same keys but different types can write generic type for NamedTuple can write generic type for NamedTuple types nilable named tuple access (3) types nilable named tuple access (3) doesn't match in type restriction doesn't match in type restriction accept named tuple in type restriction accept named tuple in type restriction types named tuple access (2) types named tuple access (2) gives error when using named args on a type other than NamedTuple gives error when using named args on a type other than NamedTuple gives error when using positional args with NamedTuple gives error when using positional args with NamedTuple gives error when indexing with an unknown name gives error when indexing with an unknown name types named tuple of two elements, follows names order types named tuple of two elements, follows names order types nilable named tuple access (1) types nilable named tuple access (1) types named tuple access (4) types named tuple access (4) doesn't unify named tuple metaclasses (#5384) doesn't unify named tuple metaclasses (#5384) accepts named tuple covariance in array accepts named tuple covariance in array types named tuple access (3) types named tuple access (3) can assign to union of compatible named tuple can assign to union of compatible named tuple types nilable named tuple access (6) types nilable named tuple access (6) matches in type restriction, different order (2) matches in type restriction, different order (2) doesn't match type restriction with instance doesn't match type restriction with instance gets type at compile time gets type at compile time types named tuple of one element types named tuple of one element types named tuple access (1) types named tuple access (1) types T as a tuple of metaclasses types T as a tuple of metaclasses matches in type restriction, different order (1) matches in type restriction, different order (1) Crystal::Repl::Interpreter closures does nested closure inside methods and blocks does nested closure inside methods and blocks does closure inside def does closure inside def closures closured block arg closures closured block arg does closure and accesses it inside block does closure and accesses it inside block closures self in proc literal closures self in proc literal closures self and modifies instance var closures self and modifies instance var passes closured struct instance var as self passes closured struct instance var as self closures def arguments closures def arguments does closure inside const does closure inside const does closure inside proc, capture proc argument does closure inside proc, capture proc argument does nested closure inside proc does nested closure inside proc doesn't mix local vars with closured vars doesn't mix local vars with closured vars does closure inside block does closure inside block does closure inside block, capture block arg does closure inside block, capture block arg closures self in proc literal (implicit self) closures self in proc literal (implicit self) does closure with two args that captures and modifies two local variables does closure with two args that captures and modifies two local variables does closure without args that captures and modifies one local variable does closure without args that captures and modifies one local variable reads self closured struct (#12341) reads self closured struct (#12341) does closure with pointerof local var does closure with pointerof local var sets ivar of self closured struct (#12341) sets ivar of self closured struct (#12341) closures struct and calls method on it closures struct and calls method on it closures block args after 8 bytes (the closure var) closures block args after 8 bytes (the closure var) does nested closure inside captured blocks does nested closure inside captured blocks does next inside captured block (#12226) does next inside captured block (#12226) does closure without args that captures and modifies two local variables does closure without args that captures and modifies two local variables gets ivar of self closured struct (#12341) gets ivar of self closured struct (#12341) does closure inside proc does closure inside proc does closure inside class variable initializer does closure inside class variable initializer Semantic: previous_def 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 with restrictions types previous def with restrictions says wrong number of arguments for previous_def (#1223) says wrong number of arguments for previous_def (#1223) types previous def in generic class types previous def in generic class types previous def with named arguments, def has bare splat parameter (#8895) types previous def with named arguments, def has bare splat parameter (#8895) types previous def with explicit arguments types previous def with explicit arguments types previous def with forwarded arguments, def has parameters types previous def with forwarded arguments, def has parameters errors if there's no previous def errors if there's no previous def 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 bare splat parameter (#8895) types previous def with forwarded arguments, def has bare splat parameter (#8895) types previous def types previous def types previous def when inside fun and forwards args types previous def when inside fun and forwards args 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) View#module_name underscore is ignored underscore is ignored namespace is divided by hyphen namespace is divided by hyphen hyphen followed by non-ascii letter is replaced by its character hyphen followed by non-ascii letter is replaced by its character Code gen: ssa codegens ssa bug with if/else on var codegens ssa bug with if/else on var codegens a var that is re-assigned in a block codegens a var that is re-assigned in a block codegens a redefined var inside method codegens a redefined var inside method codegens a redefined var inside method with argument codegens a redefined var inside method with argument codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (1) codegens ssa bug (2) codegens ssa bug (2) codegens a var that is declared in a block (2) codegens a var that is declared in a block (2) codegens ssa bug (1) codegens ssa bug (1) codegens a var that is declared in a block (1) codegens a var that is declared in a block (1) codegens a redefined var codegens a redefined var codegens declaration of var inside then when false codegens declaration of var inside then when false codegens declaration of var inside then when true codegens declaration of var inside then when true codegens a var that is re-assigned in a block (2) codegens a var that is re-assigned in a block (2) error reporting reports unexpected named argument (2) reports unexpected named argument (2) reports unexpected named argument reports unexpected named argument reports missing block reports missing block reports wrong number of arguments, with optional parameters reports wrong number of arguments, with optional parameters reports unexpected block reports unexpected block uses correct name for top-level macro methods uses correct name for top-level macro methods reports wrong number of arguments reports wrong number of arguments Semantic: generic class creates pointer of generic type and uses it creates pointer of generic type and uses it never types Generic as virtual outside generic type parameter (#3989) never types Generic as virtual outside generic type parameter (#3989) inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T inherits from generic with forwarding (2) inherits from generic with forwarding (2) defines empty initialize on inherited generic class defines empty initialize on inherited generic class doesn't consider unbound generic instantiations as concrete (#7200) doesn't consider unbound generic instantiations as concrete (#7200) can use type var that resolves to number in restriction (#6502) can use type var that resolves to number in restriction (#6502) disallow using a non-instantiated module type as a generic type argument disallow using a non-instantiated module type as a generic type argument subclasses twice with same generic class (#3423) subclasses twice with same generic class (#3423) recomputes on new subclass recomputes on new subclass errors if using Number in a generic type errors if using Number in a generic type errors if using Proc in a generic type errors if using Proc in a generic type shows error due to generic instantiation (#7083) shows error due to generic instantiation (#7083) types macro def with generic instance types macro def with generic instance doesn't find T type parameter of current type in superclass (#4604) doesn't find T type parameter of current type in superclass (#4604) doesn't allow union of generic class with module to be assigned to a generic class with module (#2425) doesn't allow union of generic class with module to be assigned to a generic class with module (#2425) calls super on generic type when superclass has no initialize (#933) calls super on generic type when superclass has no initialize (#933) instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) instantiates generic variadic class, accesses T from instance method, more args (2) instantiates generic variadic class, accesses T from instance method, more args (2) errors if splatting a non-tuple (#9853) errors if splatting a non-tuple (#9853) errors if inheriting from generic and incorrect number of type vars errors if inheriting from generic and incorrect number of type vars inherits from generic with instantiation inherits from generic with instantiation allows T::Type with T a generic type allows T::Type with T a generic type instantiates generic variadic class, accesses T from instance method through superclass instantiates generic variadic class, accesses T from instance method through superclass errors if using Number in alias errors if using Number in alias inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete virtual metaclass type implements super virtual metaclass type (#3007) virtual metaclass type implements super virtual metaclass type (#3007) inherits class methods from generic class inherits class methods from generic class restricts virtual generic instance type against generic (#3351) restricts virtual generic instance type against generic (#3351) errors if using Float in a generic type errors if using Float in a generic type nests generics with the same type var (#3297) nests generics with the same type var (#3297) errors if using Number in recursive alias errors if using Number in recursive alias gives helpful error message when generic type var is missing in block spec (#1526) gives helpful error message when generic type var is missing in block spec (#1526) errors on too nested generic instance errors on too nested generic instance gives helpful error message when generic type var is missing (#1526) gives helpful error message when generic type var is missing (#1526) initializes instance variable of generic type using type var (#961) initializes instance variable of generic type using type var (#961) allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type correctly checks argument count when target type has a splat (#9855) correctly checks argument count when target type has a splat (#9855) restricts generic type argument through alias in a non-strict way restricts generic type argument through alias in a non-strict way never types Path as virtual outside generic type parameter (#3989) never types Path as virtual outside generic type parameter (#3989) errors if inheriting from generic when it is non-generic errors if inheriting from generic when it is non-generic inherits from generic with forwarding (1) inherits from generic with forwarding (1) errors if using Object in a generic type errors if using Object in a generic type errors if using Value in a generic type errors if using Value in a generic type errors on too nested tuple instance errors on too nested tuple instance errors if passing integer literal to Proc as generic argument (#1120) errors if passing integer literal to Proc as generic argument (#1120) resolves T through metaclass inheritance (#7914) resolves T through metaclass inheritance (#7914) doesn't find unbound type parameter in main code inside generic type (#6168) doesn't find unbound type parameter in main code inside generic type (#6168) unifies generic metaclass types unifies generic metaclass types instantiates generic variadic class, accesses T from class method instantiates generic variadic class, accesses T from class method doesn't duplicate overload on generic class with class method (#2385) doesn't duplicate overload on generic class with class method (#2385) errors if invoking new on private new in generic type (#3485) errors if invoking new on private new in generic type (#3485) replaces type parameters in virtual metaclasses (#10691) replaces type parameters in virtual metaclasses (#10691) can use virtual type for generic class can use virtual type for generic class can use type var that resolves to number in restriction using Int128 can use type var that resolves to number in restriction using Int128 disallow using a non-instantiated generic type as a generic type argument disallow using a non-instantiated generic type as a generic type argument finds generic type argument from method with default value finds generic type argument from method with default value errors if using StaticArray in a generic type errors if using StaticArray in a generic type errors on too nested generic instance, with union type errors on too nested generic instance, with union type allows initializing instance variable (#665) allows initializing instance variable (#665) instantiates generic variadic class, accesses T from instance method instantiates generic variadic class, accesses T from instance method restricts generic to generic with free var restricts generic to generic with free var errors if using Class in a generic type errors if using Class in a generic type replaces type parameters for virtual types (#3235) replaces type parameters for virtual types (#3235) inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete inherits non-generic to generic (2) inherits non-generic to generic (2) errors if using Int in a generic type errors if using Int in a generic type inherits twice inherits twice errors if using Reference in a generic type errors if using Reference in a generic type errors if using Pointer in a generic type errors if using Pointer in a generic type errors if using Struct in a generic type errors if using Struct in a generic type doesn't compute generic instance var initializers in formal superclass's context (#4753) doesn't compute generic instance var initializers in formal superclass's context (#4753) inherits from generic with instantiation with instance var inherits from generic with instantiation with instance var errors if using Tuple in a generic type errors if using Tuple in a generic type restricts non-generic to generic with free var restricts non-generic to generic with free var errors if passing integer literal to Union as generic argument errors if passing integer literal to Union as generic argument errors if passing integer literal to Tuple as generic argument (#1120) errors if passing integer literal to Tuple as generic argument (#1120) instantiates generic variadic class, accesses T from class method through superclass instantiates generic variadic class, accesses T from class method through superclass can define instance var forward declared (#962) can define instance var forward declared (#962) splats generic type var splats generic type var instantiates generic variadic class, accesses T from instance method, more args instantiates generic variadic class, accesses T from instance method, more args error on T::Type with T a generic type that's a union error on T::Type with T a generic type that's a union doesn't crash when matching restriction against number literal (2) (#3157) doesn't crash when matching restriction against number literal (2) (#3157) errors if inheriting generic type and not specifying type vars (#460) errors if inheriting generic type and not specifying type vars (#460) restricts non-generic to generic restricts non-generic to generic instantiates generic variadic class, accesses T from instance method through superclass, more args instantiates generic variadic class, accesses T from instance method through superclass, more args inherits non-generic to generic (1) inherits non-generic to generic (1) errors if using Enum in a generic type errors if using Enum in a generic type errors if using Number | String in a generic type errors if using Number | String in a generic type doesn't crash when matching restriction against number literal (#3157) doesn't crash when matching restriction against number literal (#3157) creates pointer of generic type and uses it (2) creates pointer of generic type and uses it (2) expand expands macro expression inside def of nested private module expands macro expression inside def of nested private module doesn't expand macro expression doesn't expand macro expression expands macro expression inside def expands macro expression inside def expands macro expression inside private class expands macro expression inside private class expands macro expression inside enum expands macro expression inside enum expands macro expression inside module expands macro expression inside module expands macro control {% if %} with cursor inside it expands macro control {% if %} with cursor inside it expands macro expression inside class expands macro expression inside class expands macro control {% if %} expands macro control {% if %} expands macro of module with cursor at dot expands macro of module with cursor at dot expands macro control {% for %} with cursor inside it expands macro control {% for %} with cursor inside it expands macro of module with cursor at module name expands macro of module with cursor at module name expands macro expression {{ ... }} with cursor inside it expands macro expression {{ ... }} with cursor inside it expands macro expression inside private module expands macro expression inside private module expands macro expression inside C union expands macro expression inside C union expands macro expression inside private struct expands macro expression inside private struct expands macro expression {% ... %} expands macro expression {% ... %} expands simple macro expands simple macro expands macro with doc expands macro with doc expands macro expression inside struct expands macro expression inside struct expands macros with 3 level expands macros with 3 level expands macro of module expands macro of module doesn't expand macro expression with cursor out of end doesn't expand macro expression with cursor out of end expands macro expression {{ ... }} expands macro expression {{ ... }} expands macro expression inside private enum expands macro expression inside private enum expands macro control {% if %} with indent expands macro control {% if %} with indent expands macro expression {% ... %} with cursor at end of it expands macro expression {% ... %} with cursor at end of it expands simple macro with cursor inside it expands simple macro with cursor inside it expands macros with 2 level expands macros with 2 level expands macro expression inside def of private enum expands macro expression inside def of private enum doesn't expand macro expression doesn't expand macro expression expands macro control {% for %} with indent expands macro control {% for %} with indent doesn't expand normal call doesn't expand normal call expands macro expression inside fun expands macro expression inside fun expands macro expression inside private def expands macro expression inside private def expands complex macro expands complex macro expands simple macro with cursor at end of it expands simple macro with cursor at end of it expands macro expression inside def of module expands macro expression inside def of module expands macro expression inside lib expands macro expression inside lib expands macro of module inside module expands macro of module inside module expands macro expression inside C union of private lib expands macro expression inside C union of private lib expands macro control {% for %} with cursor at end of it expands macro control {% for %} with cursor at end of it expands macro expression inside def of private module expands macro expression inside def of private module expands macro control {% if %} with cursor at end of it expands macro control {% if %} with cursor at end of it expands macro expression {{ ... }} with cursor end of it expands macro expression {{ ... }} with cursor end of it expands macro expression inside def of private class expands macro expression inside def of private class expands macro expression inside private lib expands macro expression inside private lib expands macro control {% for %} expands macro control {% for %} expands macro expression inside def of nested module expands macro expression inside def of nested module expands macro expression inside def of private module expands macro expression inside def of private module expands macro expression inside C struct of private lib expands macro expression inside C struct of private lib expands macro expression inside C struct expands macro expression inside C struct expands macro expression inside def of private struct expands macro expression inside def of private struct Semantic: recursive struct check detects recursive generic struct through module (#4720) detects recursive generic struct through module (#4720) errors on recursive struct errors on recursive struct errors on recursive struct inside module errors on recursive struct inside module errors on recursive abstract struct through module (#11384) errors on recursive abstract struct through module (#11384) detects recursive struct through inheritance (#3071) detects recursive struct through inheritance (#3071) detects recursive generic struct through generic module (#4720) detects recursive generic struct through generic module (#4720) errors on recursive struct through tuple errors on recursive struct through tuple errors on recursive generic struct inside module errors on recursive generic struct inside module errors on mutually recursive struct errors on mutually recursive struct errors on recursive struct through recursive alias (#4454) (#4455) errors on recursive struct through recursive alias (#4454) (#4455) detects recursive struct through module detects recursive struct through module errors on private recursive type errors on private recursive type errors on recursive struct through named tuple errors on recursive struct through named tuple Crystal::Repl::Interpreter integration does some Hash methods does some Hash methods does JSON::Serializable does JSON::Serializable does Range#to_a, Array#to_s does Range#to_a, Array#to_s does JSON does JSON does Float64#to_s (simple) does Float64#to_s (simple) does XML does XML does caller does caller does String#includes? does String#includes? does CSV does CSV does IO.pipe (checks that StaticArray is passed correctly to C calls) does IO.pipe (checks that StaticArray is passed correctly to C calls) does Int32#to_s does Int32#to_s does Float64#to_s (complex) does Float64#to_s (complex) does YAML does YAML does YAML::Serializable does YAML::Serializable Semantic: yield with scope 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 uses method of with object uses method of with object yields with dispatch (#2171) (1) yields with dispatch (#2171) (1) generate right code when yielding struct as scope generate right code when yielding struct as scope 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 method of enclosing scope uses method of enclosing scope 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 yields virtual type (#2171) (2) yields virtual type (#2171) (2) 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 doesn't explode if specifying &block but never using it (#181) doesn't explode if specifying &block but never using it (#181) Crystal normalize_path assert assert assert assert assert assert assert assert Codegen: is_a? codegens is_a? with virtual and nil codegens is_a? with virtual and nil does is_a? with generic class metaclass does is_a? with generic class metaclass evaluates method on filtered union type evaluates method on filtered union type codegens is_a? with virtual and module codegens is_a? with virtual and module codegens is_a? with union gives false codegens is_a? with union gives false 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) does is_a?(generic type) for nested generic inheritance, through upcast (2) does is_a?(generic type) for nested generic inheritance, through upcast (2) codegens is_a? with nilable gives true codegens is_a? with nilable gives true 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) 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? 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 transforms then if condition is always truthy transforms then if condition is always truthy does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) does is_a? for generic type against generic class instance type (#12304) codegens is_a? with union gives true codegens is_a? with union gives true restricts simple type with union restricts simple type with union codegens is_a? with virtual codegens is_a? with virtual passes is_a? with generic module type on virtual type (#10302) passes is_a? with generic module type on virtual type (#10302) transforms else if condition is always falsey transforms else if condition is always falsey 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 codegens is_a? casts union to nilable codegens is_a? casts union to nilable 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) evaluate method on filtered type evaluate method on filtered type 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) does is_a? with && and true condition does is_a? with && and true condition restricts union with union restricts union with union codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no type evaluate method on filtered type nilable type not-nil evaluate method on filtered type nilable type not-nil does is_a? with more strict virtual type does is_a? with more strict virtual type says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) codegens is_a? with nilable gives false because other type 2 codegens is_a? with nilable gives false because other type 2 virtual metaclass type is not virtual instance type (#12628) virtual metaclass type is not virtual instance type (#12628) doesn't type merge (2) (#548) doesn't type merge (2) (#548) does is_a?(generic type) for nested generic inheritance (2) does is_a?(generic type) for nested generic inheritance (2) says false for value.is_a?(Class) says false for value.is_a?(Class) codegens is_a? with union gives false codegens is_a? with union gives false 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) codegens is_a? with nilable gives false because other type 1 codegens is_a? with nilable gives false because other type 1 codegens untyped var (#4009) codegens untyped var (#4009) works with inherited generic class against an instantiation (3) works with inherited generic class against an instantiation (3) does is_a?(generic type) for nested generic inheritance (1) (#9660) does is_a?(generic type) for nested generic inheritance (1) (#9660) restricts union metaclass to metaclass (#12295) restricts union metaclass to metaclass (#12295) says true for Class.is_a?(Class.class.class) (#4374) says true for Class.is_a?(Class.class.class) (#4374) does is_a? for union of module and type does is_a? for union of module and type codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no type doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) restricts virtual metaclass against virtual metaclass type restricts virtual metaclass against virtual metaclass type says true for Class.is_a?(Class.class) (#4374) says true for Class.is_a?(Class.class) (#4374) resets truthy state after visiting nodes (bug) resets truthy state after visiting nodes (bug) codegens is_a? casts union to nilable in method codegens is_a? casts union to nilable in method does is_a? for virtual generic instance type against generic does is_a? for virtual generic instance type against generic does is_a?(generic type) for nested generic inheritance, through upcast (1) does is_a?(generic type) for nested generic inheritance, through upcast (1) restricts metaclass against virtual metaclass type restricts metaclass against virtual metaclass type does is_a?/responds_to? twice (#1451) does is_a?/responds_to? twice (#1451) codegens is_a? with union gives true codegens is_a? with union gives true doesn't skip assignment when used in combination with .is_a? (true case, else) (#1121) doesn't skip assignment when used in combination with .is_a? (true case, else) (#1121) doesn't skip assignment when used in combination with .is_a? and && (#1121) doesn't skip assignment when used in combination with .is_a? and && (#1121) codegens is_a? from virtual type to module codegens is_a? from virtual type to module restricts type in else but lazily restricts type in else but lazily evaluate method on filtered type nilable type nil evaluate method on filtered type nilable type nil doesn't type merge (1) (#548) doesn't type merge (1) (#548) works with inherited generic class against an instantiation works with inherited generic class against an instantiation codegens is_a? on right side of and codegens is_a? on right side of and codegens is_a? from nilable reference union type to nil codegens is_a? from nilable reference union type to nil gives false if generic type doesn't match exactly gives false if generic type doesn't match exactly codegens is_a? false for simple type codegens is_a? false for simple type 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 codegens is_a? true for simple type codegens is_a? true for simple type codegens is_a? from nilable reference union type to type codegens is_a? from nilable reference union type to type doesn't work with inherited generic class against an instantiation (2) doesn't work with inherited generic class against an instantiation (2) evaluates method on filtered union type 2 evaluates method on filtered union type 2 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 Semantic: static array types static array with var declaration types static array with var declaration doesn't crash on instance_sizeof (#8858) doesn't crash on instance_sizeof (#8858) doesn't crash on offsetof (#8858) doesn't crash on offsetof (#8858) can match N type argument of static array (#1203) can match N type argument of static array (#1203) types static array with type as size types static array with type as size allows instantiating static array instance var in initialize of generic type allows instantiating static array instance var in initialize of generic type types static array new with size being a computed constant, and use N (bug) types static array new with size being a computed constant, and use N (bug) types static array new with size being a constant types static array new with size being a constant doesn't crash on restriction (#584) doesn't crash on restriction (#584) types static array new types static array new doesn't match other number type argument of static array (#1203) doesn't match other number type argument of static array (#1203) types static array new with size being a computed constant types static array new with size being a computed constant doesn't crash on sizeof (#8858) doesn't crash on sizeof (#8858) types static array new with size being a nested constant inside type declaration (#5426) types static array new with size being a nested constant inside type declaration (#5426) errors if trying to instantiate static array with N not an integer errors if trying to instantiate static array with N not an integer errors on negative static array size errors on negative static array size can match number type argument of static array (#1203) can match number type argument of static array (#1203) Codegen: class var doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) doesn't error if class var shares name with const (#7865) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) runs class var side effects (#8862) reads class var from virtual type reads class var from virtual type codegens second class var initializer codegens second class var initializer uses var in class var initializer uses var in class var initializer declares and initializes declares and initializes codegens class var with nilable reference type codegens class var with nilable reference type doesn't use nilable type for initializer doesn't use nilable type for initializer codegens generic class with class var codegens generic class with class var gets pointerof class var gets pointerof class var gets pointerof class var complex constant gets pointerof class var complex constant declares var as uninitialized and initializes it unsafely declares var as uninitialized and initializes it unsafely initializes class var of union with single type initializes class var of union with single type doesn't inherit class var value in subclass doesn't inherit class var value in subclass reads class var before initializing it (hoisting) reads class var before initializing it (hoisting) doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module doesn't crash with pointerof from another module writes class var from virtual type writes class var from virtual type catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var initializes dependent constant before class var codegens class var inside instance method codegens class var inside instance method doesn't inherit class var value in module doesn't inherit class var value in module codegens class var with type declaration begin and vars codegens class var with type declaration begin and vars codegens class var inside module codegens class var inside module accesses class var from proc literal accesses class var from proc literal codegens class var as nil codegens class var as nil reads simple class var before another complex one reads simple class var before another complex one reads class var from virtual type metaclass reads class var from virtual type metaclass initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal initializes class var with array literal codegens class var with begin and vars codegens class var with begin and vars codegens class var codegens class var inline initialization of simple class var inline initialization of simple class var codegens class var as nil if assigned for the first time inside method codegens class var as nil if assigned for the first time inside method initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it initializes class var the moment it reaches it Semantic: named args says no overload matches with named arg says no overload matches with named arg errors if named arg not found errors if named arg not found errors if named arg already specified, but multiple overloads (#7281) errors if named arg already specified, but multiple overloads (#7281) errors if named arg already specified errors if named arg already specified sends two regular arguments as named arguments sends two regular arguments as named arguments errors if named arg already specified but in same position errors if named arg already specified but in same position sends two regular arguments as named arguments in inverted position (1) sends two regular arguments as named arguments in inverted position (1) errors if named arg matches splat argument errors if named arg matches splat argument errors if doesn't pass named arg restriction errors if doesn't pass named arg restriction errors if named arg already specified errors if named arg already specified passes #2696 passes #2696 matches specific overload with named arguments (2) (#2753) matches specific overload with named arguments (2) (#2753) doesn't fail on named argument with NoReturn type (#7760) doesn't fail on named argument with NoReturn type (#7760) gives correct error message for missing args after * gives correct error message for missing args after * says correct error when forwarding named args (#7491) says correct error when forwarding named args (#7491) errors if missing two arguments errors if missing two arguments doesn't include arguments with default values in missing arguments error doesn't include arguments with default values in missing arguments error matches specific overload with named arguments (#2753) matches specific overload with named arguments (#2753) errors if missing one argument errors if missing one argument allows named arg if there's a splat allows named arg if there's a splat overloads based on required named args, with restrictions overloads based on required named args, with restrictions overloads based on required named args overloads based on required named args uses bare splat in new uses bare splat in new sends one regular argument as named argument sends one regular argument as named argument sends two regular arguments as named arguments in inverted position (2) sends two regular arguments as named arguments in inverted position (2) errors if named arg not found in new errors if named arg not found in new errors if named arg matches single splat argument errors if named arg matches single splat argument gives correct error message with external names (#3934) gives correct error message with external names (#3934) Crystal::Playground::AgentInstrumentorTransformer instrument literals instrument literals instrument binary expressions instrument binary expressions instrument single statement var def instrument single statement var def instrument string interpolations instrument string interpolations instrument multi statement def instrument multi statement def instrument instance variable and class variables reads and writes instrument instance variable and class variables reads and writes instrument blocks and but non multi yields instrument blocks and but non multi yields do not instrument records class do not instrument records class instrument is_a? expressions instrument is_a? expressions allow visibility modifiers allow visibility modifiers instrument ivar with obj instrument ivar with obj instrument nested class defs instrument nested class defs instrument unless statement instrument unless statement instrument returns inside def instrument returns inside def instrument while statement instrument while statement instrument literals with expression names instrument literals with expression names instrument unary expressions instrument unary expressions instrument nested blocks unless in same line instrument nested blocks unless in same line instrument typeof instrument typeof instrument single statement def instrument single statement def instrument case statement instrument case statement do not instrument top level macro calls do not instrument top level macro calls instrument chained comparisons (#4663) instrument chained comparisons (#4663) do not instrument class initializing arguments do not instrument class initializing arguments instrument print with args instrument print with args instrument blocks and single yields instrument blocks and single yields instrument inside modules instrument inside modules instrument class defs instrument class defs instrument not expressions instrument not expressions do not instrument class/module declared macro do not instrument class/module declared macro instrument exceptions instrument exceptions instrument single variables expressions instrument single variables expressions instrument assignments in the rhs instrument assignments in the rhs instrument puts with args instrument puts with args instrument if statement instrument if statement do not instrument macro calls in class do not instrument macro calls in class instrument multi assignments in the rhs instrument multi assignments in the rhs do not instrument constants assignments do not instrument constants assignments Crystal::Repl::Interpreter structs does simple class instance var initializer does simple class instance var initializer inlines struct method that returns self (#12253) inlines struct method that returns self (#12253) does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does allocate, set instance var and get instance var does allocate, set instance var and get instance var does constructor does constructor does simple struct instance var initializer does simple struct instance var initializer does class instance var initializer inheritance does class instance var initializer inheritance interprets read instance var of struct interprets read instance var of struct sets multiple instance vars in virtual abstract struct call (#12187) sets multiple instance vars in virtual abstract struct call (#12187) mutates struct inside union mutates struct inside union casts def body to def type casts def body to def type does call receiver by value from VirtualType abstract struct to union does call receiver by value from VirtualType abstract struct to union mutates struct stored in class var mutates struct stored in class var does complex class instance var initializer does complex class instance var initializer discards allocate discards allocate Compiler 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 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 Codegen: until codegens until codegens until types to_s of union of simple types union of simple types 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 named tuple named tuple union types should have parens as return type as return type as arg type as arg type should not have extra parens in pointers in pointers in tuples in tuples in arrays in arrays nilable value type nilable value type non-instantiated array non-instantiated array array of simple types array of simple types nilable reference type nilable reference type Crystal::TextHierarchyPrinter 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 works works shows correct size for Proc inside extern struct shows correct size for Proc inside extern struct Semantic: nilable cast doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) types as? with nil types as? with nil types as? with NoReturn types as? with NoReturn types as? with union types as? with union casts to module casts to module doesn't introduce type filter for nilable cast object (#12661) doesn't introduce type filter for nilable cast object (#12661) types as? types as? does upcast does upcast Normalize: regex literal StringInterpolation simple simple StringLiteral simple simple expands to const expands to const options i i x x imx imx im im empty empty Crystal::Repl::Interpreter control flow interprets if union type with nil, false interprets if union type with nil, false interprets if (nil literal) interprets if (nil literal) interprets return interprets return interprets if (true literal) interprets if (true literal) interprets until interprets until interprets while interprets while interprets while, returns nil interprets while, returns nil interprets if union type with bool, true interprets if union type with bool, true interprets if (false literal) interprets if (false literal) interprets next inside while interprets next inside while interprets break inside while interprets break inside while interprets unless interprets unless interprets if pointer, false interprets if pointer, false interprets return Nil with explicit return (#12178) interprets return Nil with explicit return (#12178) interprets next inside while inside block interprets next inside while inside block interprets if pointer, true interprets if pointer, true discards if discards if interprets return implicit nil and Int32 interprets return implicit nil and Int32 interprets break inside nested while interprets break inside nested while interprets if (nil type) interprets if (nil type) discards while discards while interprets break with value inside while (through normal flow) interprets break with value inside while (through normal flow) interprets return Nil interprets return Nil interprets if union type with bool, false interprets if union type with bool, false interprets if (int type) interprets if (int type) interprets break with value inside while (through break) interprets break with value inside while (through break) interprets break inside while inside block interprets break inside while inside block interprets if bool (false) interprets if bool (false) interprets if bool (true) interprets if bool (true) Semantic: tuples #[](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 gives error when indexing out of range gives error when indexing out of range types, inbound index, nilable types, inbound index, nilable types, inbound index types, inbound index types, out of bound, nilable types, out of bound, nilable matches tuple with splat (2) (#2932) matches tuple with splat (2) (#2932) types tuple of one element types tuple of one element #[](Path) works for named tuple indexer works for named tuple indexer works for tuple indexer works for tuple indexer errors if non-tuple is splatted inside tuple errors if non-tuple is splatted inside tuple types tuple with splats inside types tuple with splats inside errors on recursive splat expansion (#218) errors on recursive splat expansion (#218) types tuple of one element and then two elements types tuple of one element and then two elements accepts tuple covariance in array accepts tuple covariance in array matches tuple with splat (#2932) matches tuple with splat (#2932) errors if using two splat indices on restriction errors if using two splat indices on restriction errors on named tuple too big errors on named tuple too big errors on recursive splat expansion (2) (#361) errors on recursive splat expansion (2) (#361) gives error when using named args on Tuple gives error when using named args on Tuple types tuple of three elements types tuple of three elements allows tuple covariance allows tuple covariance doesn't unify tuple metaclasses (#5384) doesn't unify tuple metaclasses (#5384) accept tuple in type restriction accept tuple in type restriction can call [] on T can call [] on T doesn't trigger recursive splat expansion error (#7164) doesn't trigger recursive splat expansion error (#7164) errors on tuple too big (#3816) errors on tuple too big (#3816) errors on recursive splat expansion (1) (#361) errors on recursive splat expansion (1) (#361) can iterate T can iterate T can name a tuple type can name a tuple type doesn't crash on tuple in not executed block (#6718) doesn't crash on tuple in not executed block (#6718) types T as a tuple of metaclasses types T as a tuple of metaclasses #[](RangeLiteral) types, inbound begin, nilable types, inbound begin, nilable types, metaclass index types, metaclass index 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, begin-less types, begin-less types, out of bound begin, nilable types, out of bound begin, nilable types, inbound begin, end-less types, inbound begin, end-less types, exclusive range types, exclusive range types, inbound begin types, inbound begin doesn't error if Tuple has no args doesn't error if Tuple has no args merges two tuple types of same size merges two tuple types of same size errors if non-tuple is splatted inside tuple (2) errors if non-tuple is splatted inside tuple (2) Code gen: automatic cast casts integer variable to larger type (#9565) casts integer variable to larger type (#9565) doesn't autocast number on union (#8655) doesn't autocast number on union (#8655) casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment casts Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment does multidispatch with automatic casting (3) does multidispatch with automatic casting (3) does multidispatch with automatic casting (1) (#8217) does multidispatch with automatic casting (1) (#8217) does multidispatch with automatic casting (2) (#8217) does multidispatch with automatic casting (2) (#8217) casts symbol literal to enum casts symbol literal to enum casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) Code gen: no return codegens if with no return and variable used afterwards codegens if with no return and variable used afterwards codegen types exception handler as NoReturn if ensure is NoReturn codegen types exception handler as NoReturn if ensure is NoReturn codegens Pointer(NoReturn).malloc codegens Pointer(NoReturn).malloc codegens untyped typeof (#5105) codegens untyped typeof (#5105) codegens no return instance variable declaration (#1508) codegens no return instance variable declaration (#1508) codegens no return variable declaration (#1508) codegens no return variable declaration (#1508) codegens if with NoReturn on then and union on else codegens if with NoReturn on then and union on else codegens call with no return because of falsey if (#3661) codegens call with no return because of falsey if (#3661) Crystal::Repl::Interpreter class vars interprets class var with initializer interprets class var with initializer does class var initializer with union (#12633) does class var initializer with union (#12633) interprets class var for virtual type interprets class var for virtual type finds self in class var initializer (#12439) finds self in class var initializer (#12439) reads class var initializer with union (#12633) reads class var initializer with union (#12633) interprets class var without initializer interprets class var without initializer interprets class var for virtual metaclass type interprets class var for virtual metaclass type Semantic: union doesn't virtualize union elements (#7814) doesn't virtualize union elements (#7814) can iterate T can iterate T can reopen Union and access T can reopen Union and access T types union types union assigns to union and keeps new union type in call assigns to union and keeps new union type in call merges types in the same hierarchy with Union merges types in the same hierarchy with Union types union of same type types union of same type can use Union in type restriction (#2988) can use Union in type restriction (#2988) types union of classes types union of classes errors if instantiates union errors if instantiates union doesn't run virtual lookup on unbound unions (#9173) doesn't run virtual lookup on unbound unions (#9173) types union when both obj and arg are union types union when both obj and arg are union supports macro if inside union supports macro if inside union types union when arg is union types union when arg is union commutativity generic module instance v.s. including module generic module instance v.s. including module generic module instance v.s. extending generic module instance metaclass generic module instance v.s. extending generic module instance metaclass module v.s. including module module v.s. including module module v.s. including generic module instance module v.s. including generic module instance generic module instance v.s. including generic module instance generic module instance v.s. including generic module instance module v.s. extending generic module instance metaclass module v.s. extending generic module instance metaclass virtual metaclass v.s. generic subclass instance metaclass virtual metaclass v.s. generic subclass instance metaclass uninstantiated generic super-metaclass v.s. uninstantiated generic sub-metaclass uninstantiated generic super-metaclass v.s. uninstantiated generic sub-metaclass superclass v.s. uninstantiated generic subclass superclass v.s. uninstantiated generic subclass types union when obj is union types union when obj is union looks up type in union type with free var looks up type in union type with free var can reopen Union can reopen Union finds method in Object finds method in Object treats void as nil in union treats void as nil in union finds method in Value finds method in Value doesn't crash with union of no-types (#5805) doesn't crash with union of no-types (#5805) Semantic: exception types a var after rescue as being nilable types a var after rescue as being nilable correctly types variable assigned inside nested exception handler (#9769) correctly types variable assigned inside nested exception handler (#9769) types instance variable as nilable if assigned inside an exception handler (#1845) types instance variable as nilable if assigned inside an exception handler (#1845) can't use next inside while inside ensure (#4470) can't use next inside while inside ensure (#4470) can use next inside block inside ensure (#4470) can use next inside block inside ensure (#4470) types var assignment inside block inside exception handler (#3324) types var assignment inside block inside exception handler (#3324) 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 can't return from while inside ensure (#4470) can't return from while inside ensure (#4470) errors if caught exception is not a subclass of Exception without var errors if caught exception is not a subclass of Exception without var 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 exception with type types exception with type assigns var inside ensure (2) (#3919) assigns var inside ensure (2) (#3919) marks method calling method that raises as raises marks method calling method that raises as raises can't return from block inside ensure (#4470) can't return from block inside ensure (#4470) doesn't consider vars as nilable inside else (#610) doesn't consider vars as nilable inside else (#610) marks method calling lib fun that raises as raises marks method calling lib fun that raises as raises marks fun as raises marks fun as raises errors if caught exception is not a subclass of Exception errors if caught exception is not a subclass of Exception can't use next inside block inside ensure (#4470) can't use next inside block inside ensure (#4470) 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 shadows local variable (1) shadows local variable (1) correctly types #1988 correctly types #1988 can't use break inside block inside ensure (#4470) can't use break inside block inside ensure (#4470) doesn't infect type to variable before handler (#4002) doesn't infect type to variable before handler (#4002) type is union of main and rescue blocks type is union of main and rescue blocks 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 marks def as raises marks def as raises marks proc literal as raises marks proc literal as raises transform nodes in else block transform nodes in else block marks method that calls another method that raises as raises, recursively marks method that calls another method that raises as raises, recursively detects reading nil-if-read variable after exception handler (#4723) detects reading nil-if-read variable after exception handler (#4723) gets a non-nilable type if all rescue are unreachable (#8751) gets a non-nilable type if all rescue are unreachable (#8751) doesn't crash on break inside rescue, in while (#2441) doesn't crash on break inside rescue, in while (#2441) types exception var with no types types exception var with no types 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) remains nilable after rescue remains nilable after rescue can use break inside while inside ensure (#4470) can use break inside while inside ensure (#4470) types code with abstract exception that delegates method types code with abstract exception that delegates method type for exception handler for explicit types type for exception handler for explicit types marks instance variable as nilable if assigned inside rescue inside initialize marks instance variable as nilable if assigned inside rescue inside initialize can use break inside block inside ensure (#4470) can use break inside block inside 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" types var as nilable inside ensure (2) types var as nilable inside ensure (2) can use next inside while inside ensure (#4470) can use next inside while inside ensure (#4470) type union with empty main block type union with empty main block type union with empty rescue block type union with empty rescue block says syntax error on "begin; else; 1; end" says syntax error on "begin; else; 1; end" can't use break inside while inside ensure (#4470) can't use break inside while inside ensure (#4470) can't return from ensure (#4470) can't return from ensure (#4470) types var as nilable if previously nilable (2) types var as nilable if previously nilable (2) types var as nilable inside ensure (1) types var as nilable inside ensure (1) assigns var inside ensure (1) (#3919) assigns var inside ensure (1) (#3919) 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 nilable if previously nilable (1) types var as nilable if previously nilable (1) 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) 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) says syntax error on "begin; rescue ex; rescue; end; ex" says syntax error on "begin; rescue ex; rescue; end; ex" types a var after begin rescue with no-return in rescue types a var after begin rescue with no-return in rescue Code gen: case codegens case when constant bug (#1028) codegens case when constant bug (#1028) codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with one condition codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens case with two conditions codegens value-less case codegens value-less case codegens case with class codegens case with class codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case that always returns codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case without whens but else codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case when cond is a call codegens case with else codegens case with else codegens case with else codegens case with else codegens case with else codegens case with else codegens case with else codegens case with else codegens case with else codegens case with else does case when with metaclass does case when with metaclass Crystal::JSONHierarchyPrinter works works Crystal::Doc::Method args_to_s shows default value of arg with highlighting shows default value of arg with highlighting shows underscore restriction shows underscore restriction shows return type restriction shows return type restriction shows args and return type restriction shows args and return type restriction shows double splat args shows double splat args shows simple args shows simple args shows splat args shows splat args shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows block args with underscore shows block args with underscore 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 typeof restriction of arg with highlighting shows typeof restriction of arg with highlighting shows block args shows block args doc inherits doc from previous def (no extra comment) inherits doc from previous def (no extra comment) inherits doc from ancestor (no extra comment) inherits doc from ancestor (no extra comment) inherits doc from ancestor (use :inherit: plus more content) inherits doc from ancestor (use :inherit: plus more content) trailing comment is not a doc comment trailing comment is not a doc comment trailing comment is not part of a doc comment trailing comment is not part of a doc comment inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit:) gets doc from underlying method gets doc from underlying method Crystal::Repl::Interpreter does call without receiver inside closure does call without receiver inside closure calls proc primitive on union of module that has no subtypes (#12954) calls proc primitive on union of module that has no subtypes (#12954) procs interprets proc literal with args interprets proc literal with args can downcast Proc(T) to Proc(Nil) can downcast Proc(T) to Proc(Nil) interprets call inside Proc type interprets call inside Proc type casts from nilable proc type to proc type casts from nilable proc type to proc type interprets no args proc literal interprets no args proc literal discards proc call discards proc call casts proc call arguments to proc arg types (#12350) casts proc call arguments to proc arg types (#12350) Semantic: macro overload doesn't overwrite last macro definition if named args differs doesn't overwrite last macro definition if named args differs Code gen: tuple gets size at compile time gets size at compile time codegens tuple [1..0] codegens tuple [1..0] 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 (1) merges two tuple types of same size (1) codegens tuple [2..2]? codegens tuple [2..2]? codegens tuple [0..0] codegens tuple [0..0] codegens tuple class codegens tuple class codegens tuple [0..0]? codegens tuple [0..0]? codegens tuple metaclass [3..2]? codegens tuple metaclass [3..2]? codegens tuple metaclass [0..1] codegens tuple metaclass [0..1] codegens tuple [0..2] codegens tuple [0..2] codegens tuple [1..0]? codegens tuple [1..0]? assigns tuple to compatible tuple assigns tuple to compatible tuple codegens tuple [2]? codegens tuple [2]? codegens tuple [-3..2]? codegens tuple [-3..2]? codegens tuple [3..2]? codegens tuple [3..2]? downcasts union to mixed tuple type downcasts union to mixed tuple type codegens tuple [0]? codegens tuple [0]? assigns two same-size tuple types to a same var (#3132) assigns two same-size tuple types to a same var (#3132) passed tuple to def passed tuple to def codegens tuple [1]? codegens tuple [1]? codegens tuple [0] codegens tuple [0] upcasts tuple union to compatible tuple upcasts tuple union to compatible tuple provides T as a tuple literal provides T as a tuple literal codegens tuple metaclass [1..0] codegens tuple metaclass [1..0] codegens tuple metaclass [0] codegens tuple metaclass [0] codegens tuple [1..1] codegens tuple [1..1] accesses T and creates instance from it accesses T and creates instance from it merges two tuple types of same size (2) merges two tuple types of same size (2) codegens tuple [1] codegens tuple [1] upcasts tuple inside compatible tuple upcasts tuple inside compatible tuple codegens tuple metaclass [1] codegens tuple metaclass [1] codegens tuple [0..1] codegens tuple [0..1] codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple [0..2]? codegens tuple [0..2]? codegens tuple [0..1]? codegens tuple [0..1]? allows tuple covariance allows tuple covariance codegens tuple [1] (2) codegens tuple [1] (2) codegens tuple [2..2] codegens tuple [2..2] allows malloc pointer of tuple allows malloc pointer of 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 downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) codegens tuple metaclass [0..0] codegens tuple metaclass [0..0] downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types codegens tuple [1..1]? codegens tuple [1..1]? codegens splats inside tuples codegens splats inside tuples assigns tuple inside union to union with compatible tuple assigns tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple assigns tuple union to compatible tuple assigns tuple union to compatible tuple codegens tuple metaclass [2]? codegens tuple metaclass [2]? Semantic: struct errors on struct setter if different type errors on struct setter if different type allows inline forward declaration allows inline forward declaration errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got error in that call types struct getter with keyword name types struct getter with keyword name errors if using void via typedef in struct field type errors if using void via typedef in struct field type types struct getter types struct getter errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type errors if includes and field already exists, the other way around errors if includes and field already exists, the other way around types struct types struct errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call errors if using void in struct field type errors if using void in struct field type types struct getter multiple levels via new types struct getter multiple levels via new types struct setter types struct setter errors if includes non-cstruct type errors if includes non-cstruct type errors on empty c struct (#633) errors on empty c struct (#633) errors if invoking to_unsafe and got different type errors if invoking to_unsafe and got different type errors if already defined with another type (2) errors if already defined with another type (2) can access instance var from the outside (#1092) can access instance var from the outside (#1092) errors if already defined errors if already defined automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment marks as packed marks as packed errors if includes unknown type errors if includes unknown type types struct getter on pointer type types struct getter on pointer type types struct getter to struct types struct getter to struct includes another struct includes another struct types Struct#new types Struct#new supports macro if inside struct supports macro if inside struct errors if already defined with another type errors if already defined with another type errors if setting closure errors if setting closure errors on struct if no field errors on struct if no field errors on struct setter if different type via new errors on struct setter if different type via new errors if includes and field already exists errors if includes and field already exists Code gen: block can use global constant can use global constant 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) returns void when called with block returns void when called with block codegens captured block that returns union, but proc only returns a single type codegens captured block that returns union, but proc only returns a single type union value of yielder function union value of yielder function clears nilable var before inlining block method (#10087) clears nilable var before inlining block method (#10087) unpacks tuple but doesn't override local variables unpacks tuple but doesn't override local variables can break without value from yielder that returns nilable (2) can break without value from yielder that returns nilable (2) (bug) doesn't set needs_value to true on every yield (#12442) (bug) doesn't set needs_value to true on every yield (#12442) can access instance vars from yielder function can access instance vars from yielder function 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) does next from captured block does next from captured block nested yields nested yields codegens block with nilable type with return (1) codegens block with nilable type with return (1) passes yield arguments passes yield arguments assigns yield to argument assigns yield to argument codegens block bug with conditional next and unconditional break (1) codegens block bug with conditional next and unconditional break (1) can call methods from block when yielder is an instance method can call methods from block when yielder is an instance method doesn't crash if yield exp has no type (#12670) doesn't crash if yield exp has no type (#12670) doesn't codegen call if arg yields and always breaks doesn't codegen call if arg yields and always breaks break without value returns nil break without value returns nil block with nilable type block with nilable type 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) yields inside yield (#682) yields inside yield (#682) codegens nested return codegens nested return auto-unpacks tuple auto-unpacks tuple breaks from while in function called from block breaks from while in function called from block executes yield expression if no arg is given for block executes yield expression if no arg is given for block allows modifying yielded value (with literal) allows modifying yielded value (with literal) codegens block bug with conditional next and unconditional break (4) codegens block bug with conditional next and unconditional break (4) it yields nil from another call it yields nil from another call pass self and arguments to yielder function pass self and arguments to yielder function 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 codegens block with union arg (1) codegens block with union arg (1) codegens block which always breaks but never enters (#494) codegens block which always breaks but never enters (#494) uses block var with same name as local var uses block var with same name as local var generate inline generate inline doesn't codegen after while that always yields and breaks doesn't codegen after while that always yields and breaks can set instance vars from yielder function can set instance vars from yielder function 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 pass arguments to yielder function pass arguments to yielder function allows modifying yielded value (with variable) allows modifying yielded value (with variable) call block from dispatch call block from dispatch 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 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 breaks in var assignment (#3364) breaks in var assignment (#3364) allows yield from dispatch call allows yield from dispatch call allows using var as block arg with outer var allows using var as block arg with outer var codegens nested break codegens nested break 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 from block returns from yielder break from block returns from yielder return from block return from block pass self to yielder function pass self to yielder function break from block with value break from block with value return from block that always returns from function that conditionally yields return from block that always returns from function that conditionally yields codegens call with block with call with arg that yields codegens call with block with call with arg that yields break with value from yielder that returns a nilable break with value from yielder that returns a nilable dispatches with captured and non-captured block (#3969) dispatches with captured and non-captured block (#3969) allows initialize with yield (#224) allows initialize with yield (#224) codegens call with blocks of different type without args codegens call with blocks of different type without args doesn't crash on yield exp without a type (#8100) doesn't crash on yield exp without a type (#8100) return from yielder function return from yielder function codegens block with union with return codegens block with union with return returns from proc literal returns from proc literal 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 codegens bug with block and arg and var codegens bug with block and arg and var yields splat yields splat codegens block with nilable type with return (2) codegens block with nilable type with return (2) codegens block with repeated underscore and different types (#4711) codegens block with repeated underscore and different types (#4711) uses splat in block argument uses splat in block argument can use self inside a block called from dispatch can use self inside a block called from dispatch 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) codegens block with multiple underscores (#3054) codegens block with multiple underscores (#3054) codegens block with return and yield and no return codegens block with return and yield and no return return from block called from dispatch return from block called from dispatch allows access to local variables allows access to local variables codegens while/break inside block codegens while/break inside block codegens if with call with block (ssa issue) codegens if with call with block (ssa issue) codegens block with virtual type arg codegens block with virtual type arg uses splat in block argument, many args uses splat in block argument, many args codegens bug with yield not_nil! that is never not nil codegens bug with yield not_nil! that is never not nil block with nilable type 2 block with nilable type 2 codegens block bug with conditional next and unconditional break (2) codegens block bug with conditional next and unconditional break (2) 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) return from yielder function (2) return from yielder function (2) codegens captured block with next inside yielded block (#2097) codegens captured block with next inside yielded block (#2097) 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) yields more exps than block arg, through splat yields more exps than block arg, through splat uses block splat argument with union types uses block splat argument with union types codegens block bug with conditional next and unconditional break (3) codegens block bug with conditional next and unconditional break (3) codegens block call when argument type changes codegens block call when argument type changes 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 Code gen: module 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) codegens pointer of module and pass value to method codegens pointer of module and pass value to method codegens proc of a module that was never included codegens proc of a module that was never included 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 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) declares and includes generic module, in macros T is a tuple literal declares and includes generic module, in macros T is a tuple literal 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) can use generic module as instance variable type can use generic module as instance variable type codegens pointer of module with method codegens pointer of module with 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) codegens pointer of module with method with two including types codegens pointer of module with method with two including types expands modules to its including types (#1916) expands modules to its including types (#1916) 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 cast to module that includes bool codegens cast to module that includes bool codegens module with virtual type codegens module with virtual type codegens cast to module with class and struct to nilable module codegens cast to module with class and struct to nilable module codegens dispatch of union with module (#3647) codegens dispatch of union with module (#3647) can instantiate generic module can instantiate generic module expands modules to its including types (2) (#1916) expands modules to its including types (2) (#1916) declares proc with module type declares proc with module type codegens proc of module when generic type includes it codegens proc of module when generic type includes it 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 can use generic module as instance variable type (2) can use generic module as instance variable type (2) expands modules to its including types (3) (#1916) expands modules to its including types (3) (#1916) Parser doc includes doc for def includes doc for def includes doc for fun def includes doc for fun def includes doc for abstract def includes doc for abstract def includes doc for alias includes doc for alias includes doc for macro includes doc for macro includes doc for struct includes doc for struct includes doc for abstract class includes doc for abstract class includes doc for private def includes doc for private def includes doc for enum def includes doc for enum def includes doc for constant assign includes doc for constant assign disables doc parsing inside defs disables doc parsing inside defs includes doc for annotation includes doc for annotation includes doc for class includes doc for class includes doc for module includes doc for module includes doc for call without obj includes doc for call without obj Lexer string array using { as delimiter lexes simple string array lexes simple string array using | as delimiter lexes simple string array lexes simple string array using [ as delimiter lexes simple string array lexes simple string array lexes string array with new line gives correct column for next token lexes string array with new line gives correct column for next token lexes simple string array lexes simple string array lexes string array with new line lexes string array with new line using < as delimiter lexes simple string array lexes simple string array Code gen: def doesn't crash on private def as last expression doesn't crash on private def as last expression codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation uses var after external uses var after external allows to change argument values allows to change argument values codegens return nil when nilable type (1) codegens return nil when nilable type (1) call functions defined in any order call functions defined in any order uses self uses self codegens call without args codegens call without args codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens bug #119 codegens def which changes type of arg codegens def which changes type of arg codegens with interesting default argument codegens with interesting default argument codegens call with args codegens call with args codegens with and without many default arguments codegens with and without many default arguments runs empty def runs empty def codegens recursive type with union codegens recursive type with union use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type use target def type as return type looks up matches in super classes and merges them with subclasses looks up matches in super classes and merges them with subclasses call external function 'putchar' call external function 'putchar' codegens dispatch without obj, bug 1 codegens dispatch without obj, bug 1 codegens return nil when nilable type (2) codegens return nil when nilable type (2) uses previous argument in default value (#1062) uses previous argument in default value (#1062) uses dispatch call type for phi (#3529) uses dispatch call type for phi (#3529) can match N type argument of static array (#1203) can match N type argument of static array (#1203) codegens dispatch with nilable reference union type codegens dispatch with nilable reference union type codegens union to union assignment of mutable arg (#3691) codegens union to union assignment of mutable arg (#3691) codegens dispatch with single def when discarding unallocated ones (1) codegens dispatch with single def when discarding unallocated ones (1) codegens with related types codegens with related types codegens dispatch with single def when discarding unallocated ones (2) codegens dispatch with single def when discarding unallocated ones (2) codegens yield with destructing tuple having unreachable element codegens yield with destructing tuple having unreachable element codegens empty def codegens empty def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def unifies all calls to same def puts union before single type in matches preferences puts union before single type in matches preferences dispatches on virtual type implementing generic module (related to bug #165) dispatches on virtual type implementing generic module (related to bug #165) codegens recursive nasty code codegens recursive nasty code codegens dispatch without obj, bug 1 codegens dispatch without obj, bug 1 codegens with and without default arguments codegens with and without default arguments fixes #230: include original owner in mangled def fixes #230: include original owner in mangled def codegens dispatch on static method codegens dispatch on static method builds infinite recursive function builds infinite recursive function Crystal::Repl::Interpreter tuple discards tuple access discards tuple access interprets tuple self interprets tuple self interprets tuple range indexer (2) interprets tuple range indexer (2) interprets tuple range indexer interprets tuple range indexer discards tuple (#12383) discards tuple (#12383) extends sign when doing to_i32 extends sign when doing to_i32 interprets tuple literal of different types (1) interprets tuple literal of different types (1) interprets tuple metaclass range indexer interprets tuple metaclass range indexer does tuple indexer on union does tuple indexer on union interprets tuple literal of different types (2) interprets tuple literal of different types (2) unpacks tuple in block arguments unpacks tuple in block arguments interprets tuple literal and access by known index interprets tuple literal and access by known index interprets tuple metaclass indexer interprets tuple metaclass indexer Crystal::FFI::CallInterface .variadic validates args size validates args size basic basic zero varargs zero varargs .new with args with args array array sum struct sum struct simple call simple call all primitive arg types all primitive arg types make struct make struct Codegen: responds_to? works with generic virtual superclass (1) works with generic virtual superclass (1) works with virtual class type (1) (#1926) works with virtual class type (1) (#1926) codegens responds_to? true for simple type codegens responds_to? true for simple type works with generic virtual module (1) works with generic virtual module (1) codegens responds_to? with union gives true codegens responds_to? with union gives true codegens responds_to? with nilable gives false because other type 2 codegens responds_to? with nilable gives false because other type 2 works with generic virtual superclass (2) works with generic virtual superclass (2) codegens responds_to? with nilable gives true codegens responds_to? with nilable gives true codegens responds_to? false for simple type codegens responds_to? false for simple type works with generic virtual module (2) (#8334) works with generic virtual module (2) (#8334) works with two virtual types works with two virtual types doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) codegens responds_to? with union gives false codegens responds_to? with union gives false does for generic instance type metaclass (#4353) does for generic instance type metaclass (#4353) works with virtual type works with virtual type codegens responds_to? with generic class (2) codegens responds_to? with generic class (2) works with virtual class type (2) (#1926) works with virtual class type (2) (#1926) works with module works with module codegens responds_to? with generic class (1) codegens responds_to? with generic class (1) codegens responds_to? with nilable gives false because other type 1 codegens responds_to? with nilable gives false because other type 1 Semantic: double splat uses restriction on double splat, means all types must be that type uses restriction on double splat, means all types must be that type errors if duplicate keys on call side with two double splats errors if duplicate keys on call side with two double splats errors if duplicate keys on call side with double splat and named args errors if duplicate keys on call side with double splat and named args uses double splat restriction, matches empty uses double splat restriction, matches empty double splats named argument into arguments (1) double splats named argument into arguments (1) matches double splat on method (empty) matches double splat on method (empty) uses restriction on double splat, doesn't match with empty named tuple uses restriction on double splat, doesn't match with empty named tuple double splats named argument into arguments (2) double splats named argument into arguments (2) matches double splat on method with named args matches double splat on method with named args overloads based on double splat restriction overloads based on double splat restriction uses restriction on double splat, doesn't match with empty named tuple (2) uses restriction on double splat, doesn't match with empty named tuple (2) uses double splat restriction with concrete type uses double splat restriction with concrete type matches named args producing an empty double splat (#2678) matches named args producing an empty double splat (#2678) matches double splat on method with named args and regular args matches double splat on method with named args and regular args uses double splat restriction uses double splat restriction errors missing argument with double splat errors missing argument with double splat matches double splat with regular splat matches double splat with regular splat uses double splat in new uses double splat in new unreachable finds initializer finds initializer finds method called from instance variable initializer finds method called from instance variable initializer finds class methods finds class methods finds yielding methods finds yielding methods finds method with free variable finds method with free variable finds method called from expanded macro finds method called from expanded macro finds methods in generic type finds methods in generic type ignores autogenerated enum predicates ignores autogenerated enum predicates finds instance methods finds instance methods tallies calls tallies calls finds top level methods finds top level methods finds shadowed method finds shadowed method finds virtual method finds virtual method finds instance methods in nested types finds instance methods in nested types handles circular hierarchy references (#14034) handles circular hierarchy references (#14034) finds method with `super` finds method with `super` finds methods with proc parameter finds methods with proc parameter finds methods called from reachable code finds methods called from reachable code finds method called from expanded macro expression finds method called from expanded macro expression finds abstract method finds abstract method finds method with `previous_def` finds method with `previous_def` finds method called from proc finds method called from proc finds method called from block finds method called from block finds method in abstract type finds method in abstract type Semantic: is_a? 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 1 restricts type inside if scope 1 checks union with union checks union with union doesn't fail on untyped is_a (#10317) doesn't fail on untyped is_a (#10317) restricts type inside if scope 3 restricts type inside if scope 3 restricts type inside if else when used with module type restricts type inside if else when used with module type types if is_a? preceded by return if (preserves nops) types if is_a? preceded by return if (preserves nops) restricts type inside if scope 2 restricts type inside if scope 2 checks simple type with union checks simple type with union applies filter inside block applies filter inside block restricts type in else but lazily restricts type in else but lazily is bool is bool applies negative condition filter if then is no return applies negative condition filter if then is no return restricts other types inside if else restricts other types inside if else restricts in assignment restricts in assignment Code gen: pointer 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 codegens malloc codegens malloc passes arguments correctly for typedef metaclass (#8544) passes arguments correctly for typedef metaclass (#8544) codegens pointer cast codegens pointer cast creates pointer by address creates pointer by address codegens null pointer as if condition codegens null pointer as if condition get value of pointer to union get value of pointer to union 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 uses correct llvm module for typedef metaclass (#2877) uses correct llvm module for typedef metaclass (#2877) generates correct code for Pointer.malloc(0) (#2905) generates correct code for Pointer.malloc(0) (#2905) increments pointer increments pointer codegens pointer as if condition inside union (1) codegens pointer as if condition inside union (1) does pointerof class variable does pointerof class variable codegens pointer as if condition codegens pointer as if condition sets value of pointer to union sets value of pointer to union calculates pointer diff calculates pointer diff codegens nilable pointer type (1) codegens nilable pointer type (1) changes through var and reads from pointer changes through var and reads from pointer assigns nil and pointer to nilable pointer type assigns nil and pointer to nilable pointer type codegens nilable pointer type dispatch (2) codegens nilable pointer type dispatch (2) 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 gets pointer of instance variable in virtual type gets pointer of instance variable in virtual type codegens nilable pointer type (2) codegens nilable pointer type (2) get pointer of instance var get pointer of instance var compares pointers through typedef compares pointers through typedef can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call 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 codegens pointer as if condition inside union (2) codegens pointer as if condition inside union (2) does pointerof read variable does pointerof read variable codegens pointer cast to Nil (#8015) codegens pointer cast to Nil (#8015) set pointer value set pointer value can assign nil to void pointer can assign nil to void pointer does pointerof class variable with class does pointerof class variable with class codegens nilable pointer type dispatch (1) codegens nilable pointer type dispatch (1) codegens realloc codegens realloc passes pointer of pointer to method passes pointer of pointer to method get pointer and value of it get pointer and value of it sets value of pointer to struct sets value of pointer to struct can use typedef pointer value get and set (#630) can use typedef pointer value get and set (#630) Semantic: module gives error with cyclic include gives error with cyclic include inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete 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) can instantiate generic module can instantiate generic module can restrict module with module (#3029) can restrict module with module (#3029) errors if declares module inside if errors if declares module inside if instantiates generic variadic module, accesses T from class method through generic extend instantiates generic variadic module, accesses T from class method through generic extend includes module with Union(T*) includes module with Union(T*) includes generic module with self (check argument type, success) includes generic module with self (check argument type, success) errors when extending module that defines instance vars (#4065) errors when extending module that defines instance vars (#4065) errors if reopening generic module with different splat index (3) errors if reopening generic module with different splat index (3) extends a module extends a module extends generic module from generic class and calls class method (#7167) extends generic module from generic class and calls class method (#7167) reports can't use instance variables inside module reports can't use instance variables inside module includes generic module with self includes generic module with self errors when extending generic module that defines instance vars errors when extending generic module that defines instance vars allows overloading with included generic module allows overloading with included generic module 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 gives error when including instantiation of self, generic module gives error when including instantiation of self, generic module finds inner class from inherited one (#476) finds inner class from inherited one (#476) extends self extends self errors when extending generic module that defines instance vars (2) errors when extending generic module that defines instance vars (2) includes module in a class includes module in a class includes generic module and errors in call includes generic module and errors in call errors when extending module that defines instance vars (2) (#4065) errors when extending module that defines instance vars (2) (#4065) declares module automatically if not previously declared when declaring a class declares module automatically if not previously declared when declaring a class errors when extending self and self defines instance vars (3) (#9568) errors when extending self and self defines instance vars (3) (#9568) finds nested type inside method in block inside module finds nested type inside method in block inside module errors when extending self and self defines instance vars (#9568) errors when extending self and self defines instance vars (#9568) includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) types proc of module with generic class types proc of module with generic class gives error when including self, generic module gives error when including self, generic module inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete uses type declaration inside module, recursive, and gives error uses type declaration inside module, recursive, and gives error errors if reopening non-generic module as generic errors if reopening non-generic module as generic includes generic module with self (check return type, success) includes generic module with self (check return type, success) gives error when including self gives error when including self includes generic module explicitly includes generic module explicitly instantiates generic variadic module, accesses T from instance method through generic include instantiates generic variadic module, accesses T from instance method through generic include can use generic module as instance variable type can use generic module as instance variable type errors if reopening generic module with different type vars (2) errors if reopening generic module with different type vars (2) errors if including generic module and not specifying type vars errors if including generic module and not specifying type vars can't pass module class to virtual metaclass (#6113) can't pass module class to virtual metaclass (#6113) includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) gives error with cyclic include between non-generic and generic module gives error with cyclic include between non-generic and generic module includes generic module with self (check return subclass type, success) includes generic module with self (check return subclass type, success) types union of module and class that includes it types union of module and class that includes it uses type declaration inside module uses type declaration inside module calls super on included generic module and finds type var calls super on included generic module and finds type var includes module but wrong number of arguments includes module but wrong number of arguments types pointer of module with method with two including types types pointer of module with method with two including types gives error when trying to instantiate with new gives error when trying to instantiate with new finds class method in block finds class method in block inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T includes generic module explicitly and errors includes generic module explicitly and errors includes generic module with self (check return type, error) includes generic module with self (check return type, error) types pointer of module types pointer of module calls super on included generic module calls super on included generic module gives error with cyclic include between non-generic and generic module (2) gives error with cyclic include between non-generic and generic module (2) includes module in a module includes module in a module 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 proc of module after type changes types proc of module after type changes initializes variable in module initializes variable in module includes generic module with self (check argument type, error) includes generic module with self (check argument type, error) declares module automatically if not previously declared when declaring a module declares module automatically if not previously declared when declaring a module includes generic module with self (check return subclass type, error) includes generic module with self (check return subclass type, error) types pointer of module with generic type types pointer of module with generic type correctly types type var in included module, with a restriction with a free var (bug) correctly types type var in included module, with a restriction with a free var (bug) can't reopen as struct can't reopen as struct types pointer of module with method types pointer of module with method gives error with cyclic include, generic module gives error with cyclic include, generic module extends module from generic class and calls class method (#7167) extends module from generic class and calls class method (#7167) 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, and inherits it includes generic module with self, and inherits it instantiates generic variadic module, accesses T from instance method instantiates generic variadic module, accesses T from instance method initializes variable in module, recursive initializes variable in module, recursive includes module but not generic includes module but not generic instantiates generic variadic module, accesses T from instance method, more args instantiates generic variadic module, accesses T from instance method, more args doesn't look up initialize past module that defines initialize (#7007) doesn't look up initialize past module that defines initialize (#7007) includes but not a module includes but not a module works with range and map works with range and map gives helpful error message when generic type var is missing gives helpful error message when generic type var is missing extends generic module from generic module and calls class method (#7167) extends generic module from generic module and calls class method (#7167) can use generic module as instance variable type (2) can use generic module as instance variable type (2) errors if reopening generic module with different splat index (2) errors if reopening generic module with different splat index (2) finds types close to included module finds types close to included module errors if reopening generic module with different splat index errors if reopening generic module with different splat index gives error when trying to instantiate with allocate gives error when trying to instantiate with allocate uses :Module name for modules in errors uses :Module name for modules in errors uses type declaration inside module and gives error uses type declaration inside module and gives error includes generic module with type includes generic module with type errors when recursively extending module that defines instance vars errors when recursively extending module that defines instance vars instantiates generic variadic module, accesses T from class method instantiates generic variadic module, accesses T from class method errors if reopening generic module with different type vars errors if reopening generic module with different type vars calls super on included generic module and finds type var (2) calls super on included generic module and finds type var (2) types pointer of module with generic type types pointer of module with generic type errors when extending self and self defines instance vars (2) (#9568) errors when extending self and self defines instance vars (2) (#9568) includes generic module with another generic type includes generic module with another generic type includes module but can't access metaclass methods includes module but can't access metaclass methods 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 errors when recursively extending module that defines instance vars (2) errors when recursively extending module that defines instance vars (2) finds constant in generic module included in another module finds constant in generic module included in another module can't reopen as class can't reopen as class works with int including enumerable works with int including enumerable finds in module when included finds in module when included Crystal::Playground::Agent should send json messages and return inspected value should send json messages and return inspected value Semantic: uninitialized disallows declaring var of type Reference disallows declaring var of type Reference disallows declaring var of type Class disallows declaring var of type Class disallows declaring var of type Object disallows declaring var of type Object can uninitialize variable outside initialize, generic (#2828) can uninitialize variable outside initialize, generic (#2828) disallows declaring var of type Value disallows declaring var of type Value disallows declaring var of type Struct disallows declaring var of type Struct uses virtual type for uninitialized (#8216) uses virtual type for uninitialized (#8216) has type (#3641) has type (#3641) errors if declares var and then assigns other type errors if declares var and then assigns other type declares as uninitialized declares as uninitialized can uninitialize variable outside initialize (#2828) can uninitialize variable outside initialize (#2828) errors if declaring generic type without type vars (with class var) errors if declaring generic type without type vars (with class var) disallows declaring var of type Int disallows declaring var of type Int 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) declares as uninitialized and reads it declares as uninitialized and reads it disallows declaring var of type Float disallows declaring var of type Float 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 Number disallows declaring var of type Number can use uninitialized with class type (#2940) can use uninitialized with class type (#2940) works with uninitialized NoReturn (#3314) works with uninitialized NoReturn (#3314) disallows declaring var of type Enum disallows declaring var of type Enum Code gen: virtual type dispatches on virtual metaclass (2) dispatches on virtual metaclass (2) dispatch call with virtual type argument dispatch call with virtual type argument calls class method 1 calls class method 1 casts metaclass union type to virtual metaclass type (#6298) casts metaclass union type to virtual metaclass type (#6298) lookup instance variables in parent types lookup instance variables in parent types casts virtual type to base virtual type casts virtual type to base virtual type 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 casts virtual type to union casts virtual type to union dispatch call with nilable virtual arg dispatch call with nilable virtual arg codegens allocate for virtual type with custom new codegens allocate for virtual type with custom new codegens non-virtual call that calls virtual call to another virtual call codegens non-virtual call that calls virtual call to another virtual call dispatches on virtual metaclass (3) dispatches on virtual metaclass (3) dispatches on virtual metaclass (1) dispatches on virtual metaclass (1) can belong to union can belong to union 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 codegens virtual call with explicit self and nilable type codegens virtual call with explicit self and nilable type call base method call base method calls class method 3 calls class method 3 codegens virtual method of abstract metaclass codegens virtual method of abstract metaclass 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 doesn't lookup in Value+ when virtual type is Object+ doesn't lookup in Value+ when virtual type is Object+ codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types codegens new for virtual class with two types call base overwritten method call base overwritten method codegens virtual call with explicit self codegens virtual call with explicit self correctly dispatch call with block when the obj is a virtual type correctly dispatch call with block when the obj is a virtual type assign instance variable in virtual type assign instance variable in virtual type call overwritten method call overwritten method calls class method 2 calls class method 2 codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type codegens call to Object#to_s from virtual type returns type with virtual type def type returns type with virtual type def type codegens new for simple type, then for virtual codegens new for simple type, then for virtual 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) codegens new twice for virtual codegens new twice for virtual casts union to virtual casts union to virtual Semantic: closure errors if sending closured proc literal to C errors if sending closured proc literal to C transforms block to proc literal without parameters transforms block to proc literal without parameters marks variable as closured in program marks variable as closured in program errors if sending closured proc pointer to C (1) errors if sending closured proc pointer to C (1) doesn't assign all types to metavar if closured but declared inside block and never re-assigned doesn't assign all types to metavar if closured but declared inside block and never re-assigned marks variable as closured in def marks variable as closured in def doesn't closure typeof instance var (#9479) doesn't closure typeof instance var (#9479) 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 lookups return type in correct scope lookups return type in correct scope errors if sending closured proc pointer to C (1.2) errors if sending closured proc pointer to C (1.2) 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 marks variable as closured inside block in fun marks variable as closured inside block in fun unifies types of closured var (1) unifies types of closured var (1) errors if sending closured proc pointer to C (2) errors if sending closured proc pointer to C (2) marks method as self closured if implicit self call is made marks method as self closured if implicit self call is made 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 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 errors if giving more block args when transforming block to proc literal errors if giving more block args when transforming block to proc literal marks variable as closured in program on assign marks variable as closured in program on assign gives error when doing yield inside proc literal gives error when doing yield inside proc literal can use fun typedef as block type can use fun typedef as block type marks outer fun inside a block as closured marks outer fun inside a block as closured errors if forwarding block param doesn't match input type errors if forwarding block param doesn't match input type transforms block to proc literal transforms block to proc literal marks method as self closured if instance var is written marks method as self closured if instance var is written marks method as self closured if instance var is read marks method as self closured if instance var is read transforms block to proc literal with void type transforms block to proc literal with void type marks outer fun as closured when using self marks outer fun as closured when using self errors if forwarding block param doesn't match input type size errors if forwarding block param doesn't match input type size marks method as self closured if explicit self call is made marks method as self closured if explicit self call is made doesn't mark var as closured if only used in two block doesn't mark var as closured if only used in two block says can't send closure to C with captured block says can't send closure to C with captured block passes #227 passes #227 doesn't crash for non-existing variable (#3789) doesn't crash for non-existing variable (#3789) correctly detects previous var as closured (#5609) correctly detects previous var as closured (#5609) considers var as closure-readonly if it was assigned multiple times before it was closured considers var as closure-readonly if it was assigned multiple times before it was closured marks method as self closured if used inside a block marks method as self closured if used inside a block does assign all types to metavar if closured but only assigned to once in a loop does assign all types to metavar if closured but only assigned to once in a loop marks variable as closured in block marks variable as closured in block doesn't mark var as closured if only used in block doesn't mark var as closured if only used in block 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 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 errors when transforming block to proc literal if type mismatch errors when transforming block to proc literal if type mismatch unifies types of closured var (2) unifies types of closured var (2) 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 free var transforms block to proc literal with free var gives error when doing yield inside proc literal gives error when doing yield inside proc literal allows giving less block args when transforming block to proc literal allows giving less block args when transforming block to proc literal correctly captures type of closured block arg correctly captures type of closured block arg allows passing block as proc literal to new and to initialize allows passing block as proc literal to new and to initialize errors if sending closured proc pointer to C (3) errors if sending closured proc pointer to C (3) doesn't closure typeof local var doesn't closure typeof local var Normalize: expressions normalizes an expression normalizes an expression normalizes expressions with begin/end normalizes expressions with begin/end normalizes an empty expression with begin/end normalizes an empty expression with begin/end 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) codegens return codegens return return from function with nilable type 2 return from function with nilable type 2 codegens assign with if with two returns codegens assign with if with two returns 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 inside if codegens return inside if flattens splats inside multiple return values flattens splats inside multiple return values 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 return from function with nilable type return union return union codegens bug with return if true codegens bug with return if true Semantic: ReferenceStorage errors if T is a nilable type errors if T is a nilable type errors if T is a struct type errors if T is a struct type allows a different name allows a different name errors if T is a value type errors if T is a value type errors if T is a union type errors if T is a union type Crystal::Doc::MarkdDocRenderer renders html renders "

Foo

" renders "

Foo

" renders headline renders "## Foo Bar" renders "## Foo Bar" renders "## Foo Bar\n### Sub\n## Bar Baz\n### Sub" renders "## Foo Bar\n### Sub\n## Bar Baz\n### Sub" renders code spans renders "`