Mon Dec 1 06:25:13 UTC 2025 I: starting to build crystal/forky/amd64 on jenkins on '2025-12-01 06:24' Mon Dec 1 06:25:13 UTC 2025 I: The jenkins build log is/was available at https://jenkins.debian.net/userContent/reproducible/debian/build_service/amd64_34/93511/console.log Mon Dec 1 06:25:13 UTC 2025 I: Downloading source for forky/crystal=1.18.2+dfsg-1 --2025-12-01 06:25:13-- http://deb.debian.org/debian/pool/main/c/crystal/crystal_1.18.2%2bdfsg-1.dsc Connecting to 46.16.76.132:3128... connected. Proxy request sent, awaiting response... 200 OK Length: 2192 (2.1K) [text/prs.lines.tag] Saving to: ‘crystal_1.18.2+dfsg-1.dsc’ 0K .. 100% 276M=0s 2025-12-01 06:25:13 (276 MB/s) - ‘crystal_1.18.2+dfsg-1.dsc’ saved [2192/2192] Mon Dec 1 06:25:13 UTC 2025 I: crystal_1.18.2+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.18.2+dfsg-1 Maintainer: David Suárez Homepage: https://crystal-lang.org/ Standards-Version: 4.7.2 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: 84c4ca15d9323edbd2a8e0bd80936bf3a8bc3c8a 2531016 crystal_1.18.2+dfsg.orig.tar.xz 502388aa8257a0b3c6d58db36960c65b32c18320 67044 crystal_1.18.2+dfsg-1.debian.tar.xz Checksums-Sha256: fd75d917489cdd54d616ae3eb27f93936e4db1e269c9b8850b1a97914d3908c9 2531016 crystal_1.18.2+dfsg.orig.tar.xz f006230a72931db4057a2bfac005160960b2490c36ee9d47364136af36f9c7a7 67044 crystal_1.18.2+dfsg-1.debian.tar.xz Files: deaa05b18d08eaf3ad7b0e5b60cd61dc 2531016 crystal_1.18.2+dfsg.orig.tar.xz 0107782f5e009a76d4214715fc94bfe0 67044 crystal_1.18.2+dfsg-1.debian.tar.xz -----BEGIN PGP SIGNATURE----- iQJEBAEBCgAuFiEExFAZYDOyRoLv5EydfLboPYYFQjoFAmkl2a4QHGRlaXZAZGVi aWFuLm9yZwAKCRB8tug9hgVCOu0tEACs5vYfHf40sQcoObJCCLwQ01c++k3utEhq 34J9MJV26hV02ERJPYi+tYRlGidilkQD2FpnScBK83XerbO5VktUDWLZSvdi6RGd A9jqoZQ8IJ1UkGn4olryIh0JlfWJG4ngB8EeOkug2kMVZ3h193UxVbwaJUyrAlOB 2kneWT5SYmBuePcduvgrIxmUnK1n5hg2cd/Gw3Yu5Wh+YJU/5PRGkod3m/HJe28m Gq0foOJrIDSVJwT2RUW8NLqV/VwGISYliczx4mkwoqjRNhGFBBCC211IjP3Cyu4O rWZOKyJn11fODydptFVHN1JECND28QN4qlhvdAj2CPrUmU1OV8W/CC1GhkWwsWKe MGnkq5Y3YSjNGSvDT2MTLWShQJdnk0LjLkhAmCR+kvB5oK93X88kh0dR3wts7UZq NS3+yQRsJ0ba94Ug3KThmguksjCn9fJ0xAuH4QirtqDXk3tTsO25kVaiB0s1lE0D A4h2OOperOo+y/Eaj2HKKwdgSIaqN3j0XC4D12NWPU2kQlP13XCXYX98kvhg2gGv vNupKfWTzexEOn2B2MNkSRQpnmoRT+xCooGUTblvUxhXrFQpNlWJJ+lNQtdrUgvk Bi8gGNTvU2mkZjJBhrr/r/jUeqpN/v+sAubZqIpwLWGcXnf1UCav69UB83Z7OavT qxL6Uzv52w== =jUUp -----END PGP SIGNATURE----- Mon Dec 1 06:25:13 UTC 2025 I: Checking whether the package is not for us Mon Dec 1 06:25:13 UTC 2025 I: Starting 1st build on remote node infom02-amd64.debian.net. Mon Dec 1 06:25:13 UTC 2025 I: Preparing to do remote build '1' on infom02-amd64.debian.net. Mon Dec 1 07:49:59 UTC 2025 I: Deleting $TMPDIR on infom02-amd64.debian.net. I: pbuilder: network access will be disabled during build I: Current time: Sun Jan 3 00:48:15 -12 2027 I: pbuilder-time-stamp: 1798980495 I: Building the build Environment I: extracting base tarball [/var/cache/pbuilder/forky-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.18.2+dfsg-1.dsc] I: copying [./crystal_1.18.2+dfsg.orig.tar.xz] I: copying [./crystal_1.18.2+dfsg-1.debian.tar.xz] I: Extracting source dpkg-source: warning: cannot verify inline signature for ./crystal_1.18.2+dfsg-1.dsc: no acceptable signature found dpkg-source: info: extracting crystal in crystal-1.18.2+dfsg dpkg-source: info: unpacking crystal_1.18.2+dfsg.orig.tar.xz dpkg-source: info: unpacking crystal_1.18.2+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/152002/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=16 ' DISTRIBUTION='forky' HOME='/root' HOST_ARCH='amd64' IFS=' ' INVOCATION_ID='1dcaa7c33504465eab7ea8da05c3d816' 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='152002' 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.HyNa9oLD/pbuilderrc_i9km --distribution forky --hookdir /etc/pbuilder/first-build-hooks --debbuildopts -b --basetgz /var/cache/pbuilder/forky-reproducible-base.tgz --buildresult /srv/reproducible-results/rbuild-debian/r-b-build.HyNa9oLD/b1 --logfile b1/build.log crystal_1.18.2+dfsg-1.dsc' SUDO_GID='109' SUDO_HOME='/var/lib/jenkins' SUDO_UID='104' SUDO_USER='jenkins' TERM='unknown' TZ='/usr/share/zoneinfo/Etc/GMT+12' USER='root' _='/usr/bin/systemd-run' I: uname -a Linux infom02-amd64 6.12.57+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.57-1 (2025-11-05) x86_64 GNU/Linux I: ls -l /bin lrwxrwxrwx 1 root root 7 Aug 10 2025 /bin -> usr/bin I: user script /srv/workspace/pbuilder/152002/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 ... 19866 files and directories currently installed.) Preparing to unpack .../pbuilder-satisfydepends-dummy.deb ... Unpacking pbuilder-satisfydepends-dummy (0.invalid.0) ... dpkg: pbuilder-satisfydepends-dummy: dependency problems, but configuring anyway as you requested: pbuilder-satisfydepends-dummy depends on debhelper-compat (= 13); however: Package debhelper-compat is not installed. pbuilder-satisfydepends-dummy depends on git; however: Package git is not installed. pbuilder-satisfydepends-dummy depends on libbsd-dev; however: Package libbsd-dev is not installed. pbuilder-satisfydepends-dummy depends on libedit-dev; however: Package libedit-dev is not installed. pbuilder-satisfydepends-dummy depends on libevent-dev; however: Package libevent-dev is not installed. pbuilder-satisfydepends-dummy depends on libgc-dev (>= 1:7.6.0); however: Package libgc-dev is not installed. pbuilder-satisfydepends-dummy depends on libgmp-dev; however: Package libgmp-dev is not installed. pbuilder-satisfydepends-dummy depends on libpcre2-dev; however: Package libpcre2-dev is not installed. pbuilder-satisfydepends-dummy depends on libssl-dev; however: Package libssl-dev is not installed. pbuilder-satisfydepends-dummy depends on libtool; however: Package libtool is not installed. pbuilder-satisfydepends-dummy depends on libxml2-dev; however: Package libxml2-dev is not installed. pbuilder-satisfydepends-dummy depends on libyaml-dev; however: Package libyaml-dev is not installed. pbuilder-satisfydepends-dummy depends on libz-dev; however: Package libz-dev is not installed. pbuilder-satisfydepends-dummy depends on lld-19; however: Package lld-19 is not installed. pbuilder-satisfydepends-dummy depends on llvm-19-dev; however: Package llvm-19-dev is not installed. pbuilder-satisfydepends-dummy depends on pkgconf; however: Package pkgconf is not installed. pbuilder-satisfydepends-dummy depends on crystal (>= 1.6.0); however: Package crystal is not installed. Setting up pbuilder-satisfydepends-dummy (0.invalid.0) ... Reading package lists... Building dependency tree... Reading state information... Initializing package states... Writing extended state information... Building tag database... pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) pbuilder-satisfydepends-dummy is already installed at the requested version (0.invalid.0) The following NEW packages will be installed: autoconf{a} automake{a} autopoint{a} autotools-dev{a} bsdextrautils{a} crystal{a} debhelper{a} dh-autoreconf{a} dh-strip-nondeterminism{a} dwz{a} file{a} gettext{a} gettext-base{a} git{a} git-man{a} groff-base{a} intltool-debian{a} libarchive-zip-perl{a} libbrotli1{a} libbsd-dev{a} libclang-cpp19{a} libcom-err2{a} libcurl3t64-gnutls{a} libcurl4t64{a} libdebhelper-perl{a} libedit-dev{a} libedit2{a} libelf1t64{a} liberror-perl{a} libevent-2.1-7t64{a} libevent-core-2.1-7t64{a} libevent-dev{a} libevent-extra-2.1-7t64{a} libevent-openssl-2.1-7t64{a} libevent-pthreads-2.1-7t64{a} libexpat1{a} libffi-dev{a} libffi8{a} libfile-stripnondeterminism-perl{a} libgc-dev{a} libgc1{a} libgmp-dev{a} libgmpxx4ldbl{a} libgnutls30t64{a} libgssapi-krb5-2{a} libidn2-0{a} libjs-codemirror{a} libjs-jquery{a} libk5crypto3{a} libkeyutils1{a} libkrb5-3{a} libkrb5support0{a} libldap2{a} libllvm19{a} liblzma-dev{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} libngtcp2-crypto-ossl0{a} libp11-kit0{a} libpcre2-16-0{a} libpcre2-32-0{a} libpcre2-dev{a} libpcre2-posix3{a} libpfm4{a} libpipeline1{a} libpkgconf3{a} libpsl5t64{a} libpython3-stdlib{a} libpython3.13-minimal{a} libpython3.13-stdlib{a} libreadline8t64{a} librtmp1{a} libsasl2-2{a} libsasl2-modules-db{a} libssh2-1t64{a} libssl-dev{a} libtasn1-6{a} libtool{a} libuchardet0{a} libunistring5{a} libxml2-16{a} libxml2-dev{a} libyaml-0-2{a} libyaml-dev{a} libz3-4{a} libz3-dev{a} lld-19{a} llvm-19{a} llvm-19-dev{a} llvm-19-linker-tools{a} llvm-19-runtime{a} llvm-19-tools{a} m4{a} man-db{a} media-types{a} netbase{a} pkgconf{a} pkgconf-bin{a} po-debconf{a} python3{a} python3-minimal{a} python3-pygments{a} python3-yaml{a} python3.13{a} python3.13-minimal{a} readline-common{a} sensible-utils{a} tzdata{a} zlib1g-dev{a} The following packages are RECOMMENDED but will NOT be installed: binfmt-support ca-certificates curl javascript-common krb5-locales less libarchive-cpio-perl libgpm2 libldap-common libltdl-dev libmail-sendmail-perl libsasl2-modules lynx openssh-client publicsuffix systemd wget 0 packages upgraded, 116 newly installed, 0 to remove and 0 not upgraded. Need to get 162 MB of archives. After unpacking 882 MB will be used. Writing extended state information... Get: 1 http://deb.debian.org/debian forky/main amd64 libexpat1 amd64 2.7.3-1 [112 kB] Get: 2 http://deb.debian.org/debian forky/main amd64 libpython3.13-minimal amd64 3.13.9-1 [865 kB] Get: 3 http://deb.debian.org/debian forky/main amd64 python3.13-minimal amd64 3.13.9-1 [2257 kB] Get: 4 http://deb.debian.org/debian forky/main amd64 python3-minimal amd64 3.13.7-1 [27.2 kB] Get: 5 http://deb.debian.org/debian forky/main amd64 media-types all 14.0.0 [30.8 kB] Get: 6 http://deb.debian.org/debian forky/main amd64 netbase all 6.5 [12.4 kB] Get: 7 http://deb.debian.org/debian forky/main amd64 tzdata all 2025b-5 [260 kB] Get: 8 http://deb.debian.org/debian forky/main amd64 libffi8 amd64 3.5.2-2 [25.5 kB] Get: 9 http://deb.debian.org/debian forky/main amd64 readline-common all 8.3-3 [74.8 kB] Get: 10 http://deb.debian.org/debian forky/main amd64 libreadline8t64 amd64 8.3-3 [191 kB] Get: 11 http://deb.debian.org/debian forky/main amd64 libpython3.13-stdlib amd64 3.13.9-1 [1965 kB] Get: 12 http://deb.debian.org/debian forky/main amd64 python3.13 amd64 3.13.9-1 [764 kB] Get: 13 http://deb.debian.org/debian forky/main amd64 libpython3-stdlib amd64 3.13.7-1 [10.2 kB] Get: 14 http://deb.debian.org/debian forky/main amd64 python3 amd64 3.13.7-1 [28.3 kB] Get: 15 http://deb.debian.org/debian forky/main amd64 sensible-utils all 0.0.26 [27.0 kB] Get: 16 http://deb.debian.org/debian forky/main amd64 libmagic-mgc amd64 1:5.46-5 [338 kB] Get: 17 http://deb.debian.org/debian forky/main amd64 libmagic1t64 amd64 1:5.46-5 [109 kB] Get: 18 http://deb.debian.org/debian forky/main amd64 file amd64 1:5.46-5 [43.6 kB] Get: 19 http://deb.debian.org/debian forky/main amd64 gettext-base amd64 0.23.2-1 [245 kB] Get: 20 http://deb.debian.org/debian forky/main amd64 libuchardet0 amd64 0.0.8-2 [68.5 kB] Get: 21 http://deb.debian.org/debian forky/main amd64 groff-base amd64 1.23.0-9 [1187 kB] Get: 22 http://deb.debian.org/debian forky/main amd64 bsdextrautils amd64 2.41.2-4 [98.5 kB] Get: 23 http://deb.debian.org/debian forky/main amd64 libpipeline1 amd64 1.5.8-2 [42.1 kB] Get: 24 http://deb.debian.org/debian forky/main amd64 man-db amd64 2.13.1-1 [1469 kB] Get: 25 http://deb.debian.org/debian forky/main amd64 m4 amd64 1.4.20-2 [325 kB] Get: 26 http://deb.debian.org/debian forky/main amd64 autoconf all 2.72-3.1 [494 kB] Get: 27 http://deb.debian.org/debian forky/main amd64 autotools-dev all 20240727.1 [60.2 kB] Get: 28 http://deb.debian.org/debian forky/main amd64 automake all 1:1.18.1-3 [878 kB] Get: 29 http://deb.debian.org/debian forky/main amd64 autopoint all 0.23.2-1 [772 kB] Get: 30 http://deb.debian.org/debian forky/main amd64 libgc1 amd64 1:8.2.10-1 [251 kB] Get: 31 http://deb.debian.org/debian forky/main amd64 libedit2 amd64 3.1-20250104-1 [93.8 kB] Get: 32 http://deb.debian.org/debian forky/main amd64 libxml2-16 amd64 2.15.1+dfsg-2 [641 kB] Get: 33 http://deb.debian.org/debian forky/main amd64 libz3-4 amd64 4.13.3-1 [8560 kB] Get: 34 http://deb.debian.org/debian forky/main amd64 libllvm19 amd64 1:19.1.7-18 [26.0 MB] Get: 35 http://deb.debian.org/debian forky/main amd64 libgc-dev amd64 1:8.2.10-1 [421 kB] Get: 36 http://deb.debian.org/debian forky/main amd64 libpkgconf3 amd64 1.8.1-4 [36.4 kB] Get: 37 http://deb.debian.org/debian forky/main amd64 pkgconf-bin amd64 1.8.1-4 [30.2 kB] Get: 38 http://deb.debian.org/debian forky/main amd64 pkgconf amd64 1.8.1-4 [26.2 kB] Get: 39 http://deb.debian.org/debian forky/main amd64 libpcre2-16-0 amd64 10.46-1 [281 kB] Get: 40 http://deb.debian.org/debian forky/main amd64 libpcre2-32-0 amd64 10.46-1 [268 kB] Get: 41 http://deb.debian.org/debian forky/main amd64 libpcre2-posix3 amd64 10.46-1 [63.9 kB] Get: 42 http://deb.debian.org/debian forky/main amd64 libpcre2-dev amd64 10.46-1 [853 kB] Get: 43 http://deb.debian.org/debian forky/main amd64 libevent-2.1-7t64 amd64 2.1.12-stable-10+b1 [182 kB] Get: 44 http://deb.debian.org/debian forky/main amd64 libevent-core-2.1-7t64 amd64 2.1.12-stable-10+b1 [132 kB] Get: 45 http://deb.debian.org/debian forky/main amd64 libevent-extra-2.1-7t64 amd64 2.1.12-stable-10+b1 [108 kB] Get: 46 http://deb.debian.org/debian forky/main amd64 libevent-pthreads-2.1-7t64 amd64 2.1.12-stable-10+b1 [54.3 kB] Get: 47 http://deb.debian.org/debian forky/main amd64 libevent-openssl-2.1-7t64 amd64 2.1.12-stable-10+b1 [61.1 kB] Get: 48 http://deb.debian.org/debian forky/main amd64 libevent-dev amd64 2.1.12-stable-10+b1 [305 kB] Get: 49 http://deb.debian.org/debian forky/main amd64 libjs-codemirror all 5.65.20+~cs5.83.25-1 [733 kB] Get: 50 http://deb.debian.org/debian forky/main amd64 libjs-jquery all 3.7.1+dfsg+~3.5.33-1 [319 kB] Get: 51 http://deb.debian.org/debian forky/main amd64 crystal amd64 1.18.2+dfsg-1 [4530 kB] Get: 52 http://deb.debian.org/debian forky/main amd64 libdebhelper-perl all 13.28 [92.4 kB] Get: 53 http://deb.debian.org/debian forky/main amd64 libtool all 2.5.4-7 [540 kB] Get: 54 http://deb.debian.org/debian forky/main amd64 dh-autoreconf all 21 [12.2 kB] Get: 55 http://deb.debian.org/debian forky/main amd64 libarchive-zip-perl all 1.68-1 [104 kB] Get: 56 http://deb.debian.org/debian forky/main amd64 libfile-stripnondeterminism-perl all 1.15.0-1 [19.9 kB] Get: 57 http://deb.debian.org/debian forky/main amd64 dh-strip-nondeterminism all 1.15.0-1 [8812 B] Get: 58 http://deb.debian.org/debian forky/main amd64 libelf1t64 amd64 0.194-1 [185 kB] Get: 59 http://deb.debian.org/debian forky/main amd64 dwz amd64 0.16-2 [108 kB] Get: 60 http://deb.debian.org/debian forky/main amd64 libunistring5 amd64 1.3-2 [477 kB] Get: 61 http://deb.debian.org/debian forky/main amd64 gettext amd64 0.23.2-1 [1687 kB] Get: 62 http://deb.debian.org/debian forky/main amd64 intltool-debian all 0.35.0+20060710.6 [22.9 kB] Get: 63 http://deb.debian.org/debian forky/main amd64 po-debconf all 1.0.21+nmu1 [248 kB] Get: 64 http://deb.debian.org/debian forky/main amd64 debhelper all 13.28 [941 kB] Get: 65 http://deb.debian.org/debian forky/main amd64 libnghttp3-9 amd64 1.12.0-1 [68.4 kB] Get: 66 http://deb.debian.org/debian forky/main amd64 libngtcp2-16 amd64 1.16.0-1 [136 kB] Get: 67 http://deb.debian.org/debian forky/main amd64 libbrotli1 amd64 1.1.0-2+b7 [307 kB] Get: 68 http://deb.debian.org/debian forky/main amd64 libidn2-0 amd64 2.3.8-4 [110 kB] Get: 69 http://deb.debian.org/debian forky/main amd64 libp11-kit0 amd64 0.25.10-1 [444 kB] Get: 70 http://deb.debian.org/debian forky/main amd64 libtasn1-6 amd64 4.20.0-2 [49.9 kB] Get: 71 http://deb.debian.org/debian forky/main amd64 libgnutls30t64 amd64 3.8.10-3 [1493 kB] Get: 72 http://deb.debian.org/debian forky/main amd64 libkrb5support0 amd64 1.22.1-2 [33.1 kB] Get: 73 http://deb.debian.org/debian forky/main amd64 libcom-err2 amd64 1.47.2-3+b3 [25.0 kB] Get: 74 http://deb.debian.org/debian forky/main amd64 libk5crypto3 amd64 1.22.1-2 [81.1 kB] Get: 75 http://deb.debian.org/debian forky/main amd64 libkeyutils1 amd64 1.6.3-6 [9456 B] Get: 76 http://deb.debian.org/debian forky/main amd64 libkrb5-3 amd64 1.22.1-2 [337 kB] Get: 77 http://deb.debian.org/debian forky/main amd64 libgssapi-krb5-2 amd64 1.22.1-2 [139 kB] Get: 78 http://deb.debian.org/debian forky/main amd64 libsasl2-modules-db amd64 2.1.28+dfsg1-10 [19.8 kB] Get: 79 http://deb.debian.org/debian forky/main amd64 libsasl2-2 amd64 2.1.28+dfsg1-10 [57.8 kB] Get: 80 http://deb.debian.org/debian forky/main amd64 libldap2 amd64 2.6.10+dfsg-1 [194 kB] Get: 81 http://deb.debian.org/debian forky/main amd64 libnghttp2-14 amd64 1.64.0-1.1+b1 [76.2 kB] Get: 82 http://deb.debian.org/debian forky/main amd64 libngtcp2-crypto-gnutls8 amd64 1.16.0-1 [25.2 kB] Get: 83 http://deb.debian.org/debian forky/main amd64 libpsl5t64 amd64 0.21.2-1.1+b1 [57.2 kB] Get: 84 http://deb.debian.org/debian forky/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d.1-3 [58.3 kB] Get: 85 http://deb.debian.org/debian forky/main amd64 libssh2-1t64 amd64 1.11.1-1 [245 kB] Get: 86 http://deb.debian.org/debian forky/main amd64 libcurl3t64-gnutls amd64 8.17.0-3 [401 kB] Get: 87 http://deb.debian.org/debian forky/main amd64 liberror-perl all 0.17030-1 [26.9 kB] Get: 88 http://deb.debian.org/debian forky/main amd64 git-man all 1:2.51.0-1 [2286 kB] Get: 89 http://deb.debian.org/debian forky/main amd64 git amd64 1:2.51.0-1 [9259 kB] Get: 90 http://deb.debian.org/debian forky/main amd64 libmd-dev amd64 1.1.0-2+b1 [55.3 kB] Get: 91 http://deb.debian.org/debian forky/main amd64 libbsd-dev amd64 0.12.2-2 [258 kB] Get: 92 http://deb.debian.org/debian forky/main amd64 libclang-cpp19 amd64 1:19.1.7-18 [13.2 MB] Get: 93 http://deb.debian.org/debian forky/main amd64 libngtcp2-crypto-ossl0 amd64 1.16.0-1 [27.5 kB] Get: 94 http://deb.debian.org/debian forky/main amd64 libcurl4t64 amd64 8.17.0-3 [409 kB] Get: 95 http://deb.debian.org/debian forky/main amd64 libncurses6 amd64 6.5+20250216-2 [105 kB] Get: 96 http://deb.debian.org/debian forky/main amd64 libncurses-dev amd64 6.5+20250216-2 [353 kB] Get: 97 http://deb.debian.org/debian forky/main amd64 libedit-dev amd64 3.1-20250104-1 [115 kB] Get: 98 http://deb.debian.org/debian forky/main amd64 libffi-dev amd64 3.5.2-2 [63.7 kB] Get: 99 http://deb.debian.org/debian forky/main amd64 libgmpxx4ldbl amd64 2:6.3.0+dfsg-5 [330 kB] Get: 100 http://deb.debian.org/debian forky/main amd64 libgmp-dev amd64 2:6.3.0+dfsg-5 [658 kB] Get: 101 http://deb.debian.org/debian forky/main amd64 liblzma-dev amd64 5.8.1-2 [349 kB] Get: 102 http://deb.debian.org/debian forky/main amd64 libpfm4 amd64 4.13.0+git106-g3e4031b-1 [372 kB] Get: 103 http://deb.debian.org/debian forky/main amd64 libssl-dev amd64 3.5.4-1 [2980 kB] Get: 104 http://deb.debian.org/debian forky/main amd64 zlib1g-dev amd64 1:1.3.dfsg+really1.3.1-1+b1 [920 kB] Get: 105 http://deb.debian.org/debian forky/main amd64 libxml2-dev amd64 2.15.1+dfsg-2 [744 kB] Get: 106 http://deb.debian.org/debian forky/main amd64 libyaml-0-2 amd64 0.2.5-2 [52.5 kB] Get: 107 http://deb.debian.org/debian forky/main amd64 libyaml-dev amd64 0.2.5-2 [63.4 kB] Get: 108 http://deb.debian.org/debian forky/main amd64 libz3-dev amd64 4.13.3-1 [107 kB] Get: 109 http://deb.debian.org/debian forky/main amd64 lld-19 amd64 1:19.1.7-18 [1367 kB] Get: 110 http://deb.debian.org/debian forky/main amd64 llvm-19-runtime amd64 1:19.1.7-18 [549 kB] Get: 111 http://deb.debian.org/debian forky/main amd64 llvm-19-linker-tools amd64 1:19.1.7-18 [1267 kB] Get: 112 http://deb.debian.org/debian forky/main amd64 llvm-19 amd64 1:19.1.7-18 [16.4 MB] Get: 113 http://deb.debian.org/debian forky/main amd64 python3-pygments all 2.18.0+dfsg-2 [836 kB] Get: 114 http://deb.debian.org/debian forky/main amd64 python3-yaml amd64 6.0.2-2 [137 kB] Get: 115 http://deb.debian.org/debian forky/main amd64 llvm-19-tools amd64 1:19.1.7-18 [505 kB] Get: 116 http://deb.debian.org/debian forky/main amd64 llvm-19-dev amd64 1:19.1.7-18 [42.8 MB] Fetched 162 MB in 5s (34.9 MB/s) Preconfiguring packages ... Selecting previously unselected package libexpat1: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 ... 19866 files and directories currently installed.) Preparing to unpack .../libexpat1_2.7.3-1_amd64.deb ... Unpacking libexpat1:amd64 (2.7.3-1) ... Selecting previously unselected package libpython3.13-minimal:amd64. Preparing to unpack .../libpython3.13-minimal_3.13.9-1_amd64.deb ... Unpacking libpython3.13-minimal:amd64 (3.13.9-1) ... Selecting previously unselected package python3.13-minimal. Preparing to unpack .../python3.13-minimal_3.13.9-1_amd64.deb ... Unpacking python3.13-minimal (3.13.9-1) ... Setting up libpython3.13-minimal:amd64 (3.13.9-1) ... Setting up libexpat1:amd64 (2.7.3-1) ... Setting up python3.13-minimal (3.13.9-1) ... 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 ... 20200 files and directories currently installed.) Preparing to unpack .../0-python3-minimal_3.13.7-1_amd64.deb ... Unpacking python3-minimal (3.13.7-1) ... Selecting previously unselected package media-types. Preparing to unpack .../1-media-types_14.0.0_all.deb ... Unpacking media-types (14.0.0) ... Selecting previously unselected package netbase. Preparing to unpack .../2-netbase_6.5_all.deb ... Unpacking netbase (6.5) ... Selecting previously unselected package tzdata. Preparing to unpack .../3-tzdata_2025b-5_all.deb ... Unpacking tzdata (2025b-5) ... Selecting previously unselected package libffi8:amd64. Preparing to unpack .../4-libffi8_3.5.2-2_amd64.deb ... Unpacking libffi8:amd64 (3.5.2-2) ... Selecting previously unselected package readline-common. Preparing to unpack .../5-readline-common_8.3-3_all.deb ... Unpacking readline-common (8.3-3) ... Selecting previously unselected package libreadline8t64:amd64. Preparing to unpack .../6-libreadline8t64_8.3-3_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.3-3) ... Selecting previously unselected package libpython3.13-stdlib:amd64. Preparing to unpack .../7-libpython3.13-stdlib_3.13.9-1_amd64.deb ... Unpacking libpython3.13-stdlib:amd64 (3.13.9-1) ... Selecting previously unselected package python3.13. Preparing to unpack .../8-python3.13_3.13.9-1_amd64.deb ... Unpacking python3.13 (3.13.9-1) ... Selecting previously unselected package libpython3-stdlib:amd64. Preparing to unpack .../9-libpython3-stdlib_3.13.7-1_amd64.deb ... Unpacking libpython3-stdlib:amd64 (3.13.7-1) ... Setting up python3-minimal (3.13.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 ... 21215 files and directories currently installed.) Preparing to unpack .../000-python3_3.13.7-1_amd64.deb ... Unpacking python3 (3.13.7-1) ... Selecting previously unselected package sensible-utils. Preparing to unpack .../001-sensible-utils_0.0.26_all.deb ... Unpacking sensible-utils (0.0.26) ... Selecting previously unselected package libmagic-mgc. Preparing to unpack .../002-libmagic-mgc_1%3a5.46-5_amd64.deb ... Unpacking libmagic-mgc (1:5.46-5) ... Selecting previously unselected package libmagic1t64:amd64. Preparing to unpack .../003-libmagic1t64_1%3a5.46-5_amd64.deb ... Unpacking libmagic1t64:amd64 (1:5.46-5) ... Selecting previously unselected package file. Preparing to unpack .../004-file_1%3a5.46-5_amd64.deb ... Unpacking file (1:5.46-5) ... Selecting previously unselected package gettext-base. Preparing to unpack .../005-gettext-base_0.23.2-1_amd64.deb ... Unpacking gettext-base (0.23.2-1) ... Selecting previously unselected package libuchardet0:amd64. Preparing to unpack .../006-libuchardet0_0.0.8-2_amd64.deb ... Unpacking libuchardet0:amd64 (0.0.8-2) ... Selecting previously unselected package groff-base. Preparing to unpack .../007-groff-base_1.23.0-9_amd64.deb ... Unpacking groff-base (1.23.0-9) ... Selecting previously unselected package bsdextrautils. Preparing to unpack .../008-bsdextrautils_2.41.2-4_amd64.deb ... Unpacking bsdextrautils (2.41.2-4) ... Selecting previously unselected package libpipeline1:amd64. Preparing to unpack .../009-libpipeline1_1.5.8-2_amd64.deb ... Unpacking libpipeline1:amd64 (1.5.8-2) ... Selecting previously unselected package man-db. Preparing to unpack .../010-man-db_2.13.1-1_amd64.deb ... Unpacking man-db (2.13.1-1) ... Selecting previously unselected package m4. Preparing to unpack .../011-m4_1.4.20-2_amd64.deb ... Unpacking m4 (1.4.20-2) ... Selecting previously unselected package autoconf. Preparing to unpack .../012-autoconf_2.72-3.1_all.deb ... Unpacking autoconf (2.72-3.1) ... Selecting previously unselected package autotools-dev. Preparing to unpack .../013-autotools-dev_20240727.1_all.deb ... Unpacking autotools-dev (20240727.1) ... Selecting previously unselected package automake. Preparing to unpack .../014-automake_1%3a1.18.1-3_all.deb ... Unpacking automake (1:1.18.1-3) ... Selecting previously unselected package autopoint. Preparing to unpack .../015-autopoint_0.23.2-1_all.deb ... Unpacking autopoint (0.23.2-1) ... Selecting previously unselected package libgc1:amd64. Preparing to unpack .../016-libgc1_1%3a8.2.10-1_amd64.deb ... Unpacking libgc1:amd64 (1:8.2.10-1) ... Selecting previously unselected package libedit2:amd64. Preparing to unpack .../017-libedit2_3.1-20250104-1_amd64.deb ... Unpacking libedit2:amd64 (3.1-20250104-1) ... Selecting previously unselected package libxml2-16:amd64. Preparing to unpack .../018-libxml2-16_2.15.1+dfsg-2_amd64.deb ... Unpacking libxml2-16:amd64 (2.15.1+dfsg-2) ... Selecting previously unselected package libz3-4:amd64. Preparing to unpack .../019-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 .../020-libllvm19_1%3a19.1.7-18_amd64.deb ... Unpacking libllvm19:amd64 (1:19.1.7-18) ... Selecting previously unselected package libgc-dev:amd64. Preparing to unpack .../021-libgc-dev_1%3a8.2.10-1_amd64.deb ... Unpacking libgc-dev:amd64 (1:8.2.10-1) ... Selecting previously unselected package libpkgconf3:amd64. Preparing to unpack .../022-libpkgconf3_1.8.1-4_amd64.deb ... Unpacking libpkgconf3:amd64 (1.8.1-4) ... Selecting previously unselected package pkgconf-bin. Preparing to unpack .../023-pkgconf-bin_1.8.1-4_amd64.deb ... Unpacking pkgconf-bin (1.8.1-4) ... Selecting previously unselected package pkgconf:amd64. Preparing to unpack .../024-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 .../025-libpcre2-16-0_10.46-1_amd64.deb ... Unpacking libpcre2-16-0:amd64 (10.46-1) ... Selecting previously unselected package libpcre2-32-0:amd64. Preparing to unpack .../026-libpcre2-32-0_10.46-1_amd64.deb ... Unpacking libpcre2-32-0:amd64 (10.46-1) ... Selecting previously unselected package libpcre2-posix3:amd64. Preparing to unpack .../027-libpcre2-posix3_10.46-1_amd64.deb ... Unpacking libpcre2-posix3:amd64 (10.46-1) ... Selecting previously unselected package libpcre2-dev:amd64. Preparing to unpack .../028-libpcre2-dev_10.46-1_amd64.deb ... Unpacking libpcre2-dev:amd64 (10.46-1) ... Selecting previously unselected package libevent-2.1-7t64:amd64. Preparing to unpack .../029-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 libevent-core-2.1-7t64:amd64. Preparing to unpack .../030-libevent-core-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-core-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-extra-2.1-7t64:amd64. Preparing to unpack .../031-libevent-extra-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-extra-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-pthreads-2.1-7t64:amd64. Preparing to unpack .../032-libevent-pthreads-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-pthreads-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-openssl-2.1-7t64:amd64. Preparing to unpack .../033-libevent-openssl-2.1-7t64_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-openssl-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Selecting previously unselected package libevent-dev. Preparing to unpack .../034-libevent-dev_2.1.12-stable-10+b1_amd64.deb ... Unpacking libevent-dev (2.1.12-stable-10+b1) ... Selecting previously unselected package libjs-codemirror. Preparing to unpack .../035-libjs-codemirror_5.65.20+~cs5.83.25-1_all.deb ... Unpacking libjs-codemirror (5.65.20+~cs5.83.25-1) ... Selecting previously unselected package libjs-jquery. Preparing to unpack .../036-libjs-jquery_3.7.1+dfsg+~3.5.33-1_all.deb ... Unpacking libjs-jquery (3.7.1+dfsg+~3.5.33-1) ... Selecting previously unselected package crystal. Preparing to unpack .../037-crystal_1.18.2+dfsg-1_amd64.deb ... Unpacking crystal (1.18.2+dfsg-1) ... Selecting previously unselected package libdebhelper-perl. Preparing to unpack .../038-libdebhelper-perl_13.28_all.deb ... Unpacking libdebhelper-perl (13.28) ... Selecting previously unselected package libtool. Preparing to unpack .../039-libtool_2.5.4-7_all.deb ... Unpacking libtool (2.5.4-7) ... Selecting previously unselected package dh-autoreconf. Preparing to unpack .../040-dh-autoreconf_21_all.deb ... Unpacking dh-autoreconf (21) ... Selecting previously unselected package libarchive-zip-perl. Preparing to unpack .../041-libarchive-zip-perl_1.68-1_all.deb ... Unpacking libarchive-zip-perl (1.68-1) ... Selecting previously unselected package libfile-stripnondeterminism-perl. Preparing to unpack .../042-libfile-stripnondeterminism-perl_1.15.0-1_all.deb ... Unpacking libfile-stripnondeterminism-perl (1.15.0-1) ... Selecting previously unselected package dh-strip-nondeterminism. Preparing to unpack .../043-dh-strip-nondeterminism_1.15.0-1_all.deb ... Unpacking dh-strip-nondeterminism (1.15.0-1) ... Selecting previously unselected package libelf1t64:amd64. Preparing to unpack .../044-libelf1t64_0.194-1_amd64.deb ... Unpacking libelf1t64:amd64 (0.194-1) ... Selecting previously unselected package dwz. Preparing to unpack .../045-dwz_0.16-2_amd64.deb ... Unpacking dwz (0.16-2) ... Selecting previously unselected package libunistring5:amd64. Preparing to unpack .../046-libunistring5_1.3-2_amd64.deb ... Unpacking libunistring5:amd64 (1.3-2) ... Selecting previously unselected package gettext. Preparing to unpack .../047-gettext_0.23.2-1_amd64.deb ... Unpacking gettext (0.23.2-1) ... Selecting previously unselected package intltool-debian. Preparing to unpack .../048-intltool-debian_0.35.0+20060710.6_all.deb ... Unpacking intltool-debian (0.35.0+20060710.6) ... Selecting previously unselected package po-debconf. Preparing to unpack .../049-po-debconf_1.0.21+nmu1_all.deb ... Unpacking po-debconf (1.0.21+nmu1) ... Selecting previously unselected package debhelper. Preparing to unpack .../050-debhelper_13.28_all.deb ... Unpacking debhelper (13.28) ... Selecting previously unselected package libnghttp3-9:amd64. Preparing to unpack .../051-libnghttp3-9_1.12.0-1_amd64.deb ... Unpacking libnghttp3-9:amd64 (1.12.0-1) ... Selecting previously unselected package libngtcp2-16:amd64. Preparing to unpack .../052-libngtcp2-16_1.16.0-1_amd64.deb ... Unpacking libngtcp2-16:amd64 (1.16.0-1) ... Selecting previously unselected package libbrotli1:amd64. Preparing to unpack .../053-libbrotli1_1.1.0-2+b7_amd64.deb ... Unpacking libbrotli1:amd64 (1.1.0-2+b7) ... Selecting previously unselected package libidn2-0:amd64. Preparing to unpack .../054-libidn2-0_2.3.8-4_amd64.deb ... Unpacking libidn2-0:amd64 (2.3.8-4) ... Selecting previously unselected package libp11-kit0:amd64. Preparing to unpack .../055-libp11-kit0_0.25.10-1_amd64.deb ... Unpacking libp11-kit0:amd64 (0.25.10-1) ... Selecting previously unselected package libtasn1-6:amd64. Preparing to unpack .../056-libtasn1-6_4.20.0-2_amd64.deb ... Unpacking libtasn1-6:amd64 (4.20.0-2) ... Selecting previously unselected package libgnutls30t64:amd64. Preparing to unpack .../057-libgnutls30t64_3.8.10-3_amd64.deb ... Unpacking libgnutls30t64:amd64 (3.8.10-3) ... Selecting previously unselected package libkrb5support0:amd64. Preparing to unpack .../058-libkrb5support0_1.22.1-2_amd64.deb ... Unpacking libkrb5support0:amd64 (1.22.1-2) ... Selecting previously unselected package libcom-err2:amd64. Preparing to unpack .../059-libcom-err2_1.47.2-3+b3_amd64.deb ... Unpacking libcom-err2:amd64 (1.47.2-3+b3) ... Selecting previously unselected package libk5crypto3:amd64. Preparing to unpack .../060-libk5crypto3_1.22.1-2_amd64.deb ... Unpacking libk5crypto3:amd64 (1.22.1-2) ... Selecting previously unselected package libkeyutils1:amd64. Preparing to unpack .../061-libkeyutils1_1.6.3-6_amd64.deb ... Unpacking libkeyutils1:amd64 (1.6.3-6) ... Selecting previously unselected package libkrb5-3:amd64. Preparing to unpack .../062-libkrb5-3_1.22.1-2_amd64.deb ... Unpacking libkrb5-3:amd64 (1.22.1-2) ... Selecting previously unselected package libgssapi-krb5-2:amd64. Preparing to unpack .../063-libgssapi-krb5-2_1.22.1-2_amd64.deb ... Unpacking libgssapi-krb5-2:amd64 (1.22.1-2) ... Selecting previously unselected package libsasl2-modules-db:amd64. Preparing to unpack .../064-libsasl2-modules-db_2.1.28+dfsg1-10_amd64.deb ... Unpacking libsasl2-modules-db:amd64 (2.1.28+dfsg1-10) ... Selecting previously unselected package libsasl2-2:amd64. Preparing to unpack .../065-libsasl2-2_2.1.28+dfsg1-10_amd64.deb ... Unpacking libsasl2-2:amd64 (2.1.28+dfsg1-10) ... Selecting previously unselected package libldap2:amd64. Preparing to unpack .../066-libldap2_2.6.10+dfsg-1_amd64.deb ... Unpacking libldap2:amd64 (2.6.10+dfsg-1) ... Selecting previously unselected package libnghttp2-14:amd64. Preparing to unpack .../067-libnghttp2-14_1.64.0-1.1+b1_amd64.deb ... Unpacking libnghttp2-14:amd64 (1.64.0-1.1+b1) ... Selecting previously unselected package libngtcp2-crypto-gnutls8:amd64. Preparing to unpack .../068-libngtcp2-crypto-gnutls8_1.16.0-1_amd64.deb ... Unpacking libngtcp2-crypto-gnutls8:amd64 (1.16.0-1) ... Selecting previously unselected package libpsl5t64:amd64. Preparing to unpack .../069-libpsl5t64_0.21.2-1.1+b1_amd64.deb ... Unpacking libpsl5t64:amd64 (0.21.2-1.1+b1) ... Selecting previously unselected package librtmp1:amd64. Preparing to unpack .../070-librtmp1_2.4+20151223.gitfa8646d.1-3_amd64.deb ... Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d.1-3) ... Selecting previously unselected package libssh2-1t64:amd64. Preparing to unpack .../071-libssh2-1t64_1.11.1-1_amd64.deb ... Unpacking libssh2-1t64:amd64 (1.11.1-1) ... Selecting previously unselected package libcurl3t64-gnutls:amd64. Preparing to unpack .../072-libcurl3t64-gnutls_8.17.0-3_amd64.deb ... Unpacking libcurl3t64-gnutls:amd64 (8.17.0-3) ... Selecting previously unselected package liberror-perl. Preparing to unpack .../073-liberror-perl_0.17030-1_all.deb ... Unpacking liberror-perl (0.17030-1) ... Selecting previously unselected package git-man. Preparing to unpack .../074-git-man_1%3a2.51.0-1_all.deb ... Unpacking git-man (1:2.51.0-1) ... Selecting previously unselected package git. Preparing to unpack .../075-git_1%3a2.51.0-1_amd64.deb ... Unpacking git (1:2.51.0-1) ... Selecting previously unselected package libmd-dev:amd64. Preparing to unpack .../076-libmd-dev_1.1.0-2+b1_amd64.deb ... Unpacking libmd-dev:amd64 (1.1.0-2+b1) ... Selecting previously unselected package libbsd-dev:amd64. Preparing to unpack .../077-libbsd-dev_0.12.2-2_amd64.deb ... Unpacking libbsd-dev:amd64 (0.12.2-2) ... Selecting previously unselected package libclang-cpp19. Preparing to unpack .../078-libclang-cpp19_1%3a19.1.7-18_amd64.deb ... Unpacking libclang-cpp19 (1:19.1.7-18) ... Selecting previously unselected package libngtcp2-crypto-ossl0:amd64. Preparing to unpack .../079-libngtcp2-crypto-ossl0_1.16.0-1_amd64.deb ... Unpacking libngtcp2-crypto-ossl0:amd64 (1.16.0-1) ... Selecting previously unselected package libcurl4t64:amd64. Preparing to unpack .../080-libcurl4t64_8.17.0-3_amd64.deb ... Unpacking libcurl4t64:amd64 (8.17.0-3) ... Selecting previously unselected package libncurses6:amd64. Preparing to unpack .../081-libncurses6_6.5+20250216-2_amd64.deb ... Unpacking libncurses6:amd64 (6.5+20250216-2) ... Selecting previously unselected package libncurses-dev:amd64. Preparing to unpack .../082-libncurses-dev_6.5+20250216-2_amd64.deb ... Unpacking libncurses-dev:amd64 (6.5+20250216-2) ... Selecting previously unselected package libedit-dev:amd64. Preparing to unpack .../083-libedit-dev_3.1-20250104-1_amd64.deb ... Unpacking libedit-dev:amd64 (3.1-20250104-1) ... Selecting previously unselected package libffi-dev:amd64. Preparing to unpack .../084-libffi-dev_3.5.2-2_amd64.deb ... Unpacking libffi-dev:amd64 (3.5.2-2) ... Selecting previously unselected package libgmpxx4ldbl:amd64. Preparing to unpack .../085-libgmpxx4ldbl_2%3a6.3.0+dfsg-5_amd64.deb ... Unpacking libgmpxx4ldbl:amd64 (2:6.3.0+dfsg-5) ... Selecting previously unselected package libgmp-dev:amd64. Preparing to unpack .../086-libgmp-dev_2%3a6.3.0+dfsg-5_amd64.deb ... Unpacking libgmp-dev:amd64 (2:6.3.0+dfsg-5) ... Selecting previously unselected package liblzma-dev:amd64. Preparing to unpack .../087-liblzma-dev_5.8.1-2_amd64.deb ... Unpacking liblzma-dev:amd64 (5.8.1-2) ... Selecting previously unselected package libpfm4:amd64. Preparing to unpack .../088-libpfm4_4.13.0+git106-g3e4031b-1_amd64.deb ... Unpacking libpfm4:amd64 (4.13.0+git106-g3e4031b-1) ... Selecting previously unselected package libssl-dev:amd64. Preparing to unpack .../089-libssl-dev_3.5.4-1_amd64.deb ... Unpacking libssl-dev:amd64 (3.5.4-1) ... Selecting previously unselected package zlib1g-dev:amd64. Preparing to unpack .../090-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) ... Selecting previously unselected package libxml2-dev:amd64. Preparing to unpack .../091-libxml2-dev_2.15.1+dfsg-2_amd64.deb ... Unpacking libxml2-dev:amd64 (2.15.1+dfsg-2) ... Selecting previously unselected package libyaml-0-2:amd64. Preparing to unpack .../092-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 .../093-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 .../094-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 .../095-lld-19_1%3a19.1.7-18_amd64.deb ... Unpacking lld-19 (1:19.1.7-18) ... Selecting previously unselected package llvm-19-runtime. Preparing to unpack .../096-llvm-19-runtime_1%3a19.1.7-18_amd64.deb ... Unpacking llvm-19-runtime (1:19.1.7-18) ... Selecting previously unselected package llvm-19-linker-tools. Preparing to unpack .../097-llvm-19-linker-tools_1%3a19.1.7-18_amd64.deb ... Unpacking llvm-19-linker-tools (1:19.1.7-18) ... Selecting previously unselected package llvm-19. Preparing to unpack .../098-llvm-19_1%3a19.1.7-18_amd64.deb ... Unpacking llvm-19 (1:19.1.7-18) ... Selecting previously unselected package python3-pygments. Preparing to unpack .../099-python3-pygments_2.18.0+dfsg-2_all.deb ... Unpacking python3-pygments (2.18.0+dfsg-2) ... Selecting previously unselected package python3-yaml. Preparing to unpack .../100-python3-yaml_6.0.2-2_amd64.deb ... Unpacking python3-yaml (6.0.2-2) ... Selecting previously unselected package llvm-19-tools. Preparing to unpack .../101-llvm-19-tools_1%3a19.1.7-18_amd64.deb ... Unpacking llvm-19-tools (1:19.1.7-18) ... Selecting previously unselected package llvm-19-dev. Preparing to unpack .../102-llvm-19-dev_1%3a19.1.7-18_amd64.deb ... Unpacking llvm-19-dev (1:19.1.7-18) ... Setting up media-types (14.0.0) ... Setting up libpipeline1:amd64 (1.5.8-2) ... Setting up libkeyutils1:amd64 (1.6.3-6) ... Setting up bsdextrautils (2.41.2-4) ... Setting up libmagic-mgc (1:5.46-5) ... Setting up libarchive-zip-perl (1.68-1) ... Setting up libyaml-0-2:amd64 (0.2.5-2) ... Setting up libxml2-16:amd64 (2.15.1+dfsg-2) ... Setting up libdebhelper-perl (13.28) ... Setting up libbrotli1:amd64 (1.1.0-2+b7) ... Setting up libedit2:amd64 (3.1-20250104-1) ... Setting up libmagic1t64:amd64 (1:5.46-5) ... Setting up libnghttp2-14:amd64 (1.64.0-1.1+b1) ... Setting up gettext-base (0.23.2-1) ... Setting up m4 (1.4.20-2) ... Setting up libevent-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libcom-err2:amd64 (1.47.2-3+b3) ... Setting up file (1:5.46-5) ... Setting up libpcre2-16-0:amd64 (10.46-1) ... Setting up libelf1t64:amd64 (0.194-1) ... Setting up libkrb5support0:amd64 (1.22.1-2) ... Setting up libsasl2-modules-db:amd64 (2.1.28+dfsg1-10) ... Setting up tzdata (2025b-5) ... Current default time zone: 'Etc/UTC' Local time is now: Sun Jan 3 12:50:31 UTC 2027. Universal Time is now: Sun Jan 3 12:50:31 UTC 2027. Run 'dpkg-reconfigure tzdata' if you wish to change it. Setting up liberror-perl (0.17030-1) ... Setting up autotools-dev (20240727.1) ... Setting up libz3-4:amd64 (4.13.3-1) ... Setting up libpcre2-32-0:amd64 (10.46-1) ... Setting up libpkgconf3:amd64 (1.8.1-4) ... Setting up libgmpxx4ldbl:amd64 (2:6.3.0+dfsg-5) ... Setting up libpfm4:amd64 (4.13.0+git106-g3e4031b-1) ... Setting up libncurses6:amd64 (6.5+20250216-2) ... Setting up libunistring5:amd64 (1.3-2) ... Setting up libjs-codemirror (5.65.20+~cs5.83.25-1) ... Setting up libssl-dev:amd64 (3.5.4-1) ... Setting up autopoint (0.23.2-1) ... Setting up pkgconf-bin (1.8.1-4) ... Setting up libk5crypto3:amd64 (1.22.1-2) ... Setting up libgc1:amd64 (1:8.2.10-1) ... Setting up libsasl2-2:amd64 (2.1.28+dfsg1-10) ... Setting up autoconf (2.72-3.1) ... Setting up libnghttp3-9:amd64 (1.12.0-1) ... Setting up liblzma-dev:amd64 (5.8.1-2) ... Setting up zlib1g-dev:amd64 (1:1.3.dfsg+really1.3.1-1+b1) ... Setting up libffi8:amd64 (3.5.2-2) ... Setting up libpcre2-posix3:amd64 (10.46-1) ... Setting up dwz (0.16-2) ... Setting up sensible-utils (0.0.26) ... Setting up libuchardet0:amd64 (0.0.8-2) ... Setting up libmd-dev:amd64 (1.1.0-2+b1) ... Setting up libtasn1-6:amd64 (4.20.0-2) ... Setting up git-man (1:2.51.0-1) ... Setting up netbase (6.5) ... Setting up libngtcp2-16:amd64 (1.16.0-1) ... Setting up libkrb5-3:amd64 (1.22.1-2) ... 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.7.1+dfsg+~3.5.33-1) ... Setting up libgc-dev:amd64 (1:8.2.10-1) ... Setting up readline-common (8.3-3) ... Setting up libbsd-dev:amd64 (0.12.2-2) ... Setting up libldap2:amd64 (2.6.10+dfsg-1) ... Setting up automake (1:1.18.1-3) ... update-alternatives: using /usr/bin/automake-1.18 to provide /usr/bin/automake (automake) in auto mode Setting up libfile-stripnondeterminism-perl (1.15.0-1) ... Setting up libllvm19:amd64 (1:19.1.7-18) ... Setting up libz3-dev:amd64 (4.13.3-1) ... Setting up libncurses-dev:amd64 (6.5+20250216-2) ... Setting up gettext (0.23.2-1) ... Setting up libgmp-dev:amd64 (2:6.3.0+dfsg-5) ... Setting up libpcre2-dev:amd64 (10.46-1) ... Setting up libyaml-dev:amd64 (0.2.5-2) ... Setting up libtool (2.5.4-7) ... Setting up libevent-pthreads-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libevent-openssl-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libidn2-0:amd64 (2.3.8-4) ... Setting up libffi-dev:amd64 (3.5.2-2) ... Setting up pkgconf:amd64 (1.8.1-4) ... Setting up intltool-debian (0.35.0+20060710.6) ... Setting up dh-autoreconf (21) ... Setting up libxml2-dev:amd64 (2.15.1+dfsg-2) ... Setting up libp11-kit0:amd64 (0.25.10-1) ... Setting up libedit-dev:amd64 (3.1-20250104-1) ... Setting up libgssapi-krb5-2:amd64 (1.22.1-2) ... Setting up libngtcp2-crypto-ossl0:amd64 (1.16.0-1) ... Setting up libevent-extra-2.1-7t64:amd64 (2.1.12-stable-10+b1) ... Setting up libreadline8t64:amd64 (8.3-3) ... Setting up dh-strip-nondeterminism (1.15.0-1) ... Setting up groff-base (1.23.0-9) ... Setting up llvm-19-linker-tools (1:19.1.7-18) ... Setting up llvm-19-runtime (1:19.1.7-18) ... Setting up lld-19 (1:19.1.7-18) ... Setting up libpython3.13-stdlib:amd64 (3.13.9-1) ... Setting up libpython3-stdlib:amd64 (3.13.7-1) ... Setting up libclang-cpp19 (1:19.1.7-18) ... Setting up libgnutls30t64:amd64 (3.8.10-3) ... Setting up python3.13 (3.13.9-1) ... Setting up po-debconf (1.0.21+nmu1) ... Setting up libpsl5t64:amd64 (0.21.2-1.1+b1) ... Setting up python3 (3.13.7-1) ... Setting up man-db (2.13.1-1) ... Not building database; man-db/auto-update is not 'true'. Setting up python3-pygments (2.18.0+dfsg-2) ... Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d.1-3) ... Setting up libevent-dev (2.1.12-stable-10+b1) ... Setting up libngtcp2-crypto-gnutls8:amd64 (1.16.0-1) ... Setting up crystal (1.18.2+dfsg-1) ... Setting up libcurl4t64:amd64 (8.17.0-3) ... Setting up libcurl3t64-gnutls:amd64 (8.17.0-3) ... Setting up python3-yaml (6.0.2-2) ... Setting up debhelper (13.28) ... Setting up git (1:2.51.0-1) ... Setting up llvm-19 (1:19.1.7-18) ... Setting up llvm-19-tools (1:19.1.7-18) ... Setting up llvm-19-dev (1:19.1.7-18) ... Processing triggers for libc-bin (2.41-12) ... 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.18.2+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.18.2+dfsg-1_source.changes dpkg-buildpackage: info: source package crystal dpkg-buildpackage: info: source version 1.18.2+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 -j16 clean make[1]: Entering directory '/build/reproducible-path/crystal-1.18.2+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.18.2+dfsg' debian/rules override_dh_clean make[1]: Entering directory '/build/reproducible-path/crystal-1.18.2+dfsg' dh_clean rm -f man/*.gz rm -Rf docs make[1]: Leaving directory '/build/reproducible-path/crystal-1.18.2+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.18.2+dfsg' dh_auto_build -- release=1 verbose=1 progress=1 threads=16 CRYSTAL_CONFIG_PATH="lib:/usr/lib/crystal/lib" CRYSTAL_CACHE_DIR="/tmp/crystal" interpreter=1 make -j16 INSTALL="install --strip-program=true" release=1 verbose=1 progress=1 threads=16 CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib CRYSTAL_CACHE_DIR=/tmp/crystal interpreter=1 make[2]: Entering directory '/build/reproducible-path/crystal-1.18.2+dfsg' Using /usr/bin/llvm-config-19 [version=19.1.7] CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1764087593" CRYSTAL_CONFIG_LIBRARY_PATH='$ORIGIN/../lib/crystal' ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 16 --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.18.2+dfsg' make[1]: Leaving directory '/build/reproducible-path/crystal-1.18.2+dfsg' debian/rules override_dh_auto_test make[1]: Entering directory '/build/reproducible-path/crystal-1.18.2+dfsg' make release=1 verbose=1 progress=1 threads=16 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.18.2+dfsg' Using /usr/bin/llvm-config-19 [version=19.1.7] CRYSTAL_CONFIG_BUILD_COMMIT="" CRYSTAL_CONFIG_PATH=lib:/usr/lib/crystal/lib SOURCE_DATE_EPOCH="1764087593" ./bin/crystal build -D strict_multi_assign -D preview_overload_order --release --progress --threads 16 --link-flags="-Wl,-z,relro" --exclude-warnings spec/std --exclude-warnings spec/compiler --exclude-warnings spec/primitives --exclude-warnings src/float/printer -o .build/compiler_spec spec/compiler_spec.cr --release Using compiled compiler at .build/crystal In lib/markd/src/markd/utils.cr:5:36 5 | def self.timer(label : String, measure_time? : Bool) ^ Warning: invalid parameter name: measure_time? 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_140126304424512' 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 2 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: 67413 Parser parses "def foo(var : Int); end" parses "def foo(var : Int); end" parses "{a: 1, b: 2}" parses "{a: 1, b: 2}" parses "def foo(x @in); end" parses "def foo(x @in); end" parses "{/ /, / /}" parses "{/ /, / /}" parses "macro foo(x); 1 + 2; end" parses "macro foo(x); 1 + 2; end" parses "\"\#{1\n}\"" parses "\"\#{1\n}\"" parses "foo = 1; ->foo.&**(Int32)" parses "foo = 1; ->foo.&**(Int32)" parses "foo.<(1, 2) { 3 }" parses "foo.<(1, 2) { 3 }" says syntax error on "def foo(foo pointerof); end" says syntax error on "def foo(foo pointerof); end" parses "%w{one\ttwo}" parses "%w{one\ttwo}" parses "1.[](2)" parses "1.[](2)" parses "lib LibC\nfun getchar : Int\nend" parses "lib LibC\nfun getchar : Int\nend" parses "a : Foo = 1" parses "a : Foo = 1" says syntax error on "until return; end" says syntax error on "until return; end" says syntax error on "break ? 1 : 2" says syntax error on "break ? 1 : 2" parses "typeof : Int32" parses "typeof : Int32" parses "foo(0, n &* 2)" parses "foo(0, n &* 2)" parses "break *1" parses "break *1" parses "property with : Int32" parses "property with : Int32" parses "lib LibC; struct Foo; x : Int**; end end" parses "lib LibC; struct Foo; x : Int**; end end" parses "def foo(x, *y : Int32); 1; end" parses "def foo(x, *y : Int32); 1; end" parses "a { |x| x } / b" parses "a { |x| x } / b" parses "lib LibC; {{ 1 }}; end" parses "lib LibC; {{ 1 }}; end" parses "if foo; 1; elsif bar; 2; else 3; end" parses "if foo; 1; elsif bar; 2; else 3; end" parses "break *{1, 2}" parses "break *{1, 2}" sets location of top-level fun name sets location of top-level fun name parses "def foo(x @fun); end" parses "def foo(x @fun); end" parses "def foo(x @@next); end" parses "def foo(x @@next); end" parses "foo.**(1, 2) { 3 }" parses "foo.**(1, 2) { 3 }" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" parses "case 1\nwhen .responds_to?(:foo)\n2\nend" says syntax error on "foo { |return| }" says syntax error on "foo { |return| }" parses "@a = uninitialized Foo" parses "@a = uninitialized Foo" parses "end : Int32" parses "end : Int32" says syntax error on "a.[] 0 += 1" says syntax error on "a.[] 0 += 1" parses "{% if 1\n x\nend %}" parses "{% if 1\n x\nend %}" parses "def foo(x @instance_sizeof); end" parses "def foo(x @instance_sizeof); end" parses "[1] /2" parses "[1] /2" parses ":<=>" parses ":<=>" parses "foo(n > 2)" parses "foo(n > 2)" parses "a.foo, a.bar = 1, 2" parses "a.foo, a.bar = 1, 2" parses "foo(/a/)" parses "foo(/a/)" parses "n > 2" parses "n > 2" parses "def foo(@require); end" parses "def foo(@require); end" parses "foo = 1; b = 2; foo +b" parses "foo = 1; b = 2; foo +b" parses "foo(*{1})" parses "foo(*{1})" parses "foo.- do end" parses "foo.- do end" parses "@a : Foo = 1" parses "@a : Foo = 1" says syntax error on "lib Foo; union Bar->(x : Qux){}" says syntax error on "lib Foo; union Bar->(x : Qux){}" parses "{\n{1}\n}" parses "{\n{1}\n}" says syntax error on "break === 1" says syntax error on "break === 1" parses "<<-'EOF'.x\n foo\nEOF" parses "<<-'EOF'.x\n foo\nEOF" says syntax error on "def foo(foo yield); end" says syntax error on "def foo(foo yield); end" parses "Foo({x: X})" parses "Foo({x: X})" parses "->@foo.foo" parses "->@foo.foo" parses "case 1\nwhen .as?(T)\n2\nend" parses "case 1\nwhen .as?(T)\n2\nend" parses "abstract def foo(x) : Int32" parses "abstract def foo(x) : Int32" parses "extend Foo" parses "extend Foo" parses "foo(z: 0, a: n < 2)" parses "foo(z: 0, a: n < 2)" parses "select\nwhen foo\n2\nelse\n3\nend" parses "select\nwhen foo\n2\nelse\n3\nend" parses "x[+ 1]" parses "x[+ 1]" parses "def self./; end;" parses "def self./; end;" says syntax error on "def foo var; end" says syntax error on "def foo var; end" parses "def foo(case foo); end" parses "def foo(case foo); end" parses "lib LibC; Foo = 1; end" parses "lib LibC; Foo = 1; end" parses "def type(type); end" parses "def type(type); end" parses "foo.bar = (1).abs" parses "foo.bar = (1).abs" says syntax error on "until break; end" says syntax error on "until break; end" says syntax error on "class Foo\"a\"" says syntax error on "class Foo\"a\"" parses "module Foo \"a\" end" parses "module Foo \"a\" end" parses "def foo; end" parses "def foo; end" parses ":*" parses ":*" parses "{% begin %}%| %s |{% end %}" parses "{% begin %}%| %s |{% end %}" parses "foo &.each do\nend" parses "foo &.each do\nend" parses "puts {{**1}}" parses "puts {{**1}}" says syntax error on "unless break; end" says syntax error on "unless break; end" parses "def foo(&\n); end" parses "def foo(&\n); end" says syntax error on "*a if true = 2" says syntax error on "*a if true = 2" parses "struct Foo ->{} end" parses "struct Foo ->{} end" parses ":!~" parses ":!~" says syntax error on "->::foo.foo" says syntax error on "->::foo.foo" says syntax error on "case 1\nwhen .+=(2)" says syntax error on "case 1\nwhen .+=(2)" parses "{% begin %}%Q< %s >{% end %}" parses "{% begin %}%Q< %s >{% end %}" says syntax error on "def foo(foo next); end" says syntax error on "def foo(foo next); end" parses "\"hello \" \\\n \"world\"" parses "\"hello \" \\\n \"world\"" says syntax error on "foo(return)" says syntax error on "foo(return)" parses "foo = 1; foo -1" parses "foo = 1; foo -1" says syntax error on "case x; when :a; 2; when :a; end" says syntax error on "case x; when :a; 2; when :a; end" says syntax error on "def foo(macro); end" says syntax error on "def foo(macro); end" says syntax warning on "foo do |foo, bar!|\nend" says syntax warning on "foo do |foo, bar!|\nend" parses "call \"foo\"" parses "call \"foo\"" parses "class Foo(T, *U); end" parses "class Foo(T, *U); end" parses "1 % 2" parses "1 % 2" parses ":[]?" parses ":[]?" parses "foo\n\n .bar" parses "foo\n\n .bar" parses "1.as? Bar" parses "1.as? Bar" parses "foo(a: n &** 2)" parses "foo(a: n &** 2)" 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 do; 1; end]" parses "foo.[bar do; 1; end]" parses "foo.[](bar do; 1; end)" parses "foo.[](bar do; 1; end)" parses "foo.[](bar { 1 })" parses "foo.[](bar { 1 })" gets corrects of ~ gets corrects of ~ says syntax error on "return % 1" says syntax error on "return % 1" parses "def &; end;" parses "def &; end;" parses "puts __LINE__" parses "puts __LINE__" parses "foo.==" parses "foo.==" parses "def foo(x @offsetof); end" parses "def foo(x @offsetof); end" says syntax error on "case x; when /x/; 2; when /x/; end" says syntax error on "case x; when /x/; 2; when /x/; end" parses "def foo(@@lib); end" parses "def foo(@@lib); end" parses "{% unless 1\n x\nend %}" parses "{% unless 1\n x\nend %}" parses "def foo(x, *y); 1; end" parses "def foo(x, *y); 1; end" parses "foo./" parses "foo./" says syntax error on "foo(1\n,2)" says syntax error on "foo(1\n,2)" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "a ? 1 :\n b ? 2 :\n c ? 3\n : 0" parses "{%\n1\n2\n3\n%}" parses "{%\n1\n2\n3\n%}" parses "Set {1, 2, 3}" parses "Set {1, 2, 3}" parses "def foo(a, &block : Foo); end" parses "def foo(a, &block : Foo); end" parses "asm : Int32" parses "asm : Int32" parses "foo(n <= 2)" parses "foo(n <= 2)" parses "foo = 1; ->foo.foo=" parses "foo = 1; ->foo.foo=" parses "foo(&.@bar.baz)" parses "foo(&.@bar.baz)" parses "when : Int32" parses "when : Int32" parses "1 !~ 2" parses "1 !~ 2" parses "Foo(T | U)" parses "Foo(T | U)" parses "a/b" parses "a/b" parses "def foo(@lib); end" parses "def foo(@lib); end" parses "def foo(break foo); end" parses "def foo(break foo); end" parses "def foo(@@class); end" parses "def foo(@@class); end" parses "!a && b" parses "!a && b" parses "foo(z: 0, a: n &+ 2)" parses "foo(z: 0, a: n &+ 2)" says syntax error on "lib Foo; struct Bar%()" says syntax error on "lib Foo; struct Bar%()" parses "a.b &*=\n1" parses "a.b &*=\n1" parses "foo(**bar)" parses "foo(**bar)" says syntax error on "struct Foo\"a\"" says syntax error on "struct Foo\"a\"" says syntax error on "select\nwhen 1\n2\nend" says syntax error on "select\nwhen 1\n2\nend" says syntax error on "{1 2}" says syntax error on "{1 2}" parses "my_def def foo\nloop do\nend\nend" parses "my_def def foo\nloop do\nend\nend" parses "foo(a: n // 2)" parses "foo(a: n // 2)" parses "->@foo.foo!" parses "->@foo.foo!" parses "%r(\\/)" parses "%r(\\/)" parses "a = 1\nfoo -a" parses "a = 1\nfoo -a" parses "foo(z: 0, a: n <= 2)" parses "foo(z: 0, a: n <= 2)" parses "break *1, 2" parses "break *1, 2" parses "a.b +=\n1" parses "a.b +=\n1" parses "module Foo(*T); end" parses "module Foo(*T); end" parses "foo 1" parses "foo 1" parses "1_i64" parses "1_i64" parses "begin; 1; rescue; 2; end" parses "begin; 1; rescue; 2; end" parses "foo(n - 2)" parses "foo(n - 2)" parses "def foo(@pointerof); end" parses "def foo(@pointerof); end" sets correct location for fun def sets correct location for fun def parses "offsetof(X, @a)" parses "offsetof(X, @a)" parses "->() : Int32 do end" parses "->() : Int32 do end" parses "return 1 if true" parses "return 1 if true" parses "def foo(@@include); end" parses "def foo(@@include); end" says syntax error on "foo { |(begin)| }" says syntax error on "foo { |(begin)| }" parses "foo.== do end" parses "foo.== do end" parses "1 // 2" parses "1 // 2" parses "next *1, 2" parses "next *1, 2" parses "foo(n << 2)" parses "foo(n << 2)" parses "def foo; / /; end" parses "def foo; / /; end" parses "{%\na = 1\n%}" parses "{%\na = 1\n%}" parses "->Foo.&*(Int32)" parses "->Foo.&*(Int32)" parses "Foo({x: X, y: Y})" parses "Foo({x: X, y: Y})" parses "def foo(x @select); end" parses "def foo(x @select); end" parses "def foo(\nvar\n); end" parses "def foo(\nvar\n); end" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "\u3042.\u3044, \u3046.\u3048.\u304A = 1, 2" parses "1 - 2" parses "1 - 2" says syntax error on "case x; when nil; 2; when nil; end" says syntax error on "case x; when nil; 2; when nil; end" parses "Int[8]?" parses "Int[8]?" 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 "sizeof : Int32" parses "sizeof : Int32" parses "struct Foo; end" parses "struct Foo; end" parses "1 <= 2" parses "1 <= 2" parses "foo(n &** 2)" parses "foo(n &** 2)" parses "module Foo [1] end" parses "module Foo [1] end" parses "a.b %=\n1" parses "a.b %=\n1" parses "foo = 1; ->foo.foo?" parses "foo = 1; ->foo.foo?" parses "Foo.foo(count: 3).bar { }" parses "Foo.foo(count: 3).bar { }" says syntax error on "foo { |private| }" says syntax error on "foo { |private| }" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" says syntax error on "def foo(x : (Int32, Int32) | Int32); end" parses "1.as?(\n Int32\n)" parses "1.as?(\n Int32\n)" says syntax error on "1 ... next" says syntax error on "1 ... next" parses "foo &.each {\n}" parses "foo &.each {\n}" parses "foo = 1; ->foo.>=(Int32)" parses "foo = 1; ->foo.>=(Int32)" says syntax error on "struct Foo{|a|a}" says syntax error on "struct Foo{|a|a}" parses "property extend : Int32" parses "property extend : Int32" parses "foo(z: 0, a: n &** 2)" parses "foo(z: 0, a: n &** 2)" parses "def foo(@@struct); end" parses "def foo(@@struct); end" parses "foo.===(1, 2) { 3 }" parses "foo.===(1, 2) { 3 }" parses "def foo(x @case); end" parses "def foo(x @case); end" parses "property if : Int32" parses "property if : Int32" parses "foo out @x; @x" parses "foo out @x; @x" parses "false" parses "false" says syntax error on "a = 1; a += next" says syntax error on "a = 1; a += next" parses "foo(z: 0, a: n > 2)" parses "foo(z: 0, a: n > 2)" parses "def foo(out foo); end" parses "def foo(out foo); end" parses "def <<(); end" parses "def <<(); end" parses "annotation Foo\nend\nrequire \"bar\"" parses "annotation Foo\nend\nrequire \"bar\"" parses "enum Foo : UInt16; end" parses "enum Foo : UInt16; end" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "lib LibC\nfun getch = \"get.char\" : Int32\nend" parses "a = 1; a *=\n1" parses "a = 1; a *=\n1" parses "def downto(n)\n1\nend" parses "def downto(n)\n1\nend" parses "macro foo\n\"\\'\"\nend" parses "macro foo\n\"\\'\"\nend" says syntax error on "break when true" says syntax error on "break when true" parses "->@@foo.foo!" parses "->@@foo.foo!" parses ":[]?" parses ":[]?" says syntax error on "macro foo(x y z); end" says syntax error on "macro foo(x y z); end" parses "def foo(bar! foo); end" parses "def foo(bar! foo); end" parses "def foo(@true); end" parses "def foo(@true); end" parses ":=~" parses ":=~" parses "def *(); end;" parses "def *(); end;" parses "Foo({String, ->})" parses "Foo({String, ->})" says syntax error on "def foo(foo struct); end" says syntax error on "def foo(foo struct); end" parses ":|" parses ":|" parses "def foo(true foo); end" parses "def foo(true foo); end" says syntax error on "return.foo" says syntax error on "return.foo" parses "def =~; end" parses "def =~; end" parses ":foo!" parses ":foo!" says syntax error on "def foo(x : U) forall U, U; end" says syntax error on "def foo(x : U) forall U, U; end" says syntax error on "lib Foo; union Bar:Qux" says syntax error on "lib Foo; union Bar:Qux" sets correct location of argument in named tuple type sets correct location of argument in named tuple type says syntax error on "def foo(x\n,y); 1; end" says syntax error on "def foo(x\n,y); 1; end" parses "Foo({X, Y})" parses "Foo({X, Y})" parses "macro foo;%var{1, x} = hello;end" parses "macro foo;%var{1, x} = hello;end" 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 "-1_i64" parses "-1_i64" says syntax error on "def foo(end); end" says syntax error on "def foo(end); end" parses "def foo(a, &block : Int, self -> Double); end" parses "def foo(a, &block : Int, self -> Double); end" parses "1.~" parses "1.~" parses "def foo(x @out); end" parses "def foo(x @out); end" parses "foo %r()" parses "foo %r()" parses "property class : Int32" parses "property class : Int32" parses ":[]" parses ":[]" says syntax error on "foo(next)" says syntax error on "foo(next)" parses "1 ** 2" parses "1 ** 2" parses "lib LibC; enum Foo; A = 1; B; end end" parses "lib LibC; enum Foo; A = 1; B; end end" parses "def self.-; end;" parses "def self.-; end;" parses "foo(&.as?(T))" parses "foo(&.as?(T))" parses "foo = 1; ->foo.&*(Int32)" parses "foo = 1; ->foo.&*(Int32)" parses "if : Int32" parses "if : Int32" parses "foo(0, n ^ 2)" parses "foo(0, n ^ 2)" says syntax error on "{1, ->{ |x| x } }" says syntax error on "{1, ->{ |x| x } }" parses "struct Foo %x() end" parses "struct Foo %x() end" parses "def foo(private foo); end" parses "def foo(private foo); end" parses "Foo(1)" parses "Foo(1)" says syntax error on "a = 1, 2, 3" says syntax error on "a = 1, 2, 3" parses "def foo(x @with); end" parses "def foo(x @with); end" parses "1" parses "1" parses "abstract def foo; 1" parses "abstract def foo; 1" says syntax error on "enum Foo:Qux" says syntax error on "enum Foo:Qux" says syntax error on "a {} += 1" says syntax error on "a {} += 1" says syntax error on "$foo" says syntax error on "$foo" parses "def +(); end" parses "def +(); end" parses "foo(bar!)" parses "foo(bar!)" says syntax error on "foo { |abstract| }" says syntax error on "foo { |abstract| }" parses "annotation Foo\n\nend" parses "annotation Foo\n\nend" parses "def self.^; end;" parses "def self.^; end;" parses "def self.%; end;" parses "def self.%; end;" says syntax error on "def foo(yield); end" says syntax error on "def foo(yield); end" says syntax error on "a {} = 1" says syntax error on "a {} = 1" parses "foo(z: 0, a: n ^ 2)" parses "foo(z: 0, a: n ^ 2)" parses "foo.bar(1).baz" parses "foo.bar(1).baz" parses "def foo(var : (Int, Float -> Double)); end" parses "def foo(var : (Int, Float -> Double)); end" says syntax error on "next &* 1" says syntax error on "next &* 1" says syntax error on "def foo(foo instance_sizeof); end" says syntax error on "def foo(foo instance_sizeof); end" parses "foo(1 + 2)" parses "foo(1 + 2)" parses "foo result : Int32; result" parses "foo result : Int32; result" parses "def foo(@false); end" parses "def foo(@false); end" parses "a = b = 2" parses "a = b = 2" parses "a.foo &block" parses "a.foo &block" says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "{1, ->do\n|x| x\end }" says syntax error on "lib Foo; struct Bar{|a|a}" says syntax error on "lib Foo; struct Bar{|a|a}" parses "[\n1,2\n]" parses "[\n1,2\n]" says syntax error on "foo(&block) {}" says syntax error on "foo(&block) {}" parses "def ===; end;" parses "def ===; end;" parses "next;" parses "next;" parses "foo(&.is_a?(T))" parses "foo(&.is_a?(T))" says syntax error on "return * 1" says syntax error on "return * 1" parses "{% x unless 1 %}" parses "{% x unless 1 %}" parses "def &*(); end" parses "def &*(); end" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "lib LibC; {% if 1 %}2{% end %}; end" parses "foo.&" parses "foo.&" parses "struct Foo {1} end" parses "struct Foo {1} end" parses "{% begin %}%r(\\A){% end %}" parses "{% begin %}%r(\\A){% end %}" parses "def self.===; end;" parses "def self.===; end;" parses "+1" parses "+1" parses "foo(0, n &+ 2)" parses "foo(0, n &+ 2)" parses "foo %x" parses "foo %x" says syntax error on "def foo(var = x : Int); end" says syntax error on "def foo(var = x : Int); end" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "a ? 1 : b ? 2 : c ? 3 : 0" parses "property module : Int32" parses "property module : Int32" parses "{% a = 1 if 2 %}" parses "{% a = 1 if 2 %}" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "macro foo;bar{% unless x %}body{% end %}baz;end" parses "{% begin %}%i{ %s }{% end %}" parses "{% begin %}%i{ %s }{% end %}" says syntax error on "enum Foo : Int32\"a\"" says syntax error on "enum Foo : Int32\"a\"" parses "property alias : Int32" parses "property alias : Int32" parses "%w{one two}" parses "%w{one two}" parses "macro foo\n\"\\\\\"\nend" parses "macro foo\n\"\\\\\"\nend" parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "def foo(@[Foo] @[Bar] var : Int32); end" parses "1 unless 3" parses "1 unless 3" parses "class Foo ->{} end" parses "class Foo ->{} end" parses "a, b, *c = 1" parses "a, b, *c = 1" parses ":\"\\u{61}\"" parses ":\"\\u{61}\"" parses "begin 1 end / 2" parses "begin 1 end / 2" says syntax error on "lib Foo; union Bar {|a|a}" says syntax error on "lib Foo; union Bar {|a|a}" parses "def <=(); end" parses "def <=(); end" parses "foo.[]= do end" parses "foo.[]= do end" parses "def foo(@@typeof); end" parses "def foo(@@typeof); end" gets corrects end location for var + var gets corrects end location for var + var says syntax error on "macro foo.bar;end" says syntax error on "macro foo.bar;end" parses "property sizeof : Int32" parses "property sizeof : Int32" parses "Foo{\"x\" => \"y\"}" parses "Foo{\"x\" => \"y\"}" says syntax error on "1 as? Bar" says syntax error on "1 as? Bar" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "lib LibC\nfun getch = \"get.char\"(x : Int32)\nend" parses "macro foo(@[Foo] outer inner);end" parses "macro foo(@[Foo] outer inner);end" parses "foo.%" parses "foo.%" parses "def foo(x @@select); end" parses "def foo(x @@select); end" parses "foo(a: n > 2)" parses "foo(a: n > 2)" says syntax error on "def foo(typeof); end" says syntax error on "def foo(typeof); end" parses "a = 1; a *= 1" parses "a = 1; a *= 1" says syntax error on "A = begin; 1; rescue; 1; else; B = 1; end" says syntax error on "A = begin; 1; rescue; 1; else; B = 1; end" says syntax error on "foo { |(private)| }" says syntax error on "foo { |(private)| }" says syntax error on "def foo(x y, x z); end" says syntax error on "def foo(x y, x z); end" parses "foo = 1; ->foo.foo" parses "foo = 1; ->foo.foo" says syntax error on "def foo(foo begin); end" says syntax error on "def foo(foo begin); end" says syntax error on "foo.[]? += 1" says syntax error on "foo.[]? += 1" parses "a, b = 1, 2 if 3" parses "a, b = 1, 2 if 3" parses "enum Foo; @@foo = 1\n A \n end" parses "enum Foo; @@foo = 1\n A \n end" parses "def foo(@@yield); end" parses "def foo(@@yield); end" says syntax error on "break &* 1" says syntax error on "break &* 1" parses "foo.<=(1, 2) { 3 }" parses "foo.<=(1, 2) { 3 }" parses "offsetof : Int32" parses "offsetof : Int32" operator as macro name parses "macro *;end" parses "macro *;end" parses "macro =~;end" parses "macro =~;end" parses "macro ^;end" parses "macro ^;end" parses "macro +;end" parses "macro +;end" parses "macro %;end" parses "macro %;end" parses "macro <;end" parses "macro <;end" parses "macro !=;end" parses "macro !=;end" parses "macro &**;end" parses "macro &**;end" parses "macro !~;end" parses "macro !~;end" parses "macro |;end" parses "macro |;end" parses "macro `;end" parses "macro `;end" parses "macro >;end" parses "macro >;end" parses "macro ~;end" parses "macro ~;end" parses "macro []=;end" parses "macro []=;end" parses "macro &-;end" parses "macro &-;end" parses "macro <=>;end" parses "macro <=>;end" parses "macro &+;end" parses "macro &+;end" parses "macro **;end" parses "macro **;end" parses "macro []?;end" parses "macro []?;end" parses "macro &;end" parses "macro &;end" parses "macro <=;end" parses "macro <=;end" parses "macro /;end" parses "macro /;end" parses "macro -;end" parses "macro -;end" parses "macro >=;end" parses "macro >=;end" parses "macro <<;end" parses "macro <<;end" parses "macro //;end" parses "macro //;end" parses "macro >>;end" parses "macro >>;end" parses "macro &*;end" parses "macro &*;end" parses "macro ==;end" parses "macro ==;end" parses "macro ===;end" parses "macro ===;end" parses "while true; end;" parses "while true; end;" parses "%i(foo(bar) baz)" parses "%i(foo(bar) baz)" parses "enum Foo; {% if 1 %}2{% end %}; end" parses "enum Foo; {% if 1 %}2{% end %}; end" says syntax error on "Foo(T U)" says syntax error on "Foo(T U)" says syntax error on "lib Foo; struct Bar:qux" says syntax error on "lib Foo; struct Bar:qux" parses "def foo(@def); end" parses "def foo(@def); end" parses "def foo(x @abstract); end" parses "def foo(x @abstract); end" parses "foo = 1; ->foo.&(Int32)" parses "foo = 1; ->foo.&(Int32)" parses "def foo(@class); end" parses "def foo(@class); end" parses "foo%r" parses "foo%r" says syntax error on "break / 1" says syntax error on "break / 1" parses "property select : Int32" parses "property select : Int32" parses "return {1 => 2}" parses "return {1 => 2}" says syntax error on "fun foo(Int32); end" says syntax error on "fun foo(Int32); end" parses "foo(&.as(T).bar)" parses "foo(&.as(T).bar)" parses "if foo; 1; end" parses "if foo; 1; end" parses "foo = 1; ->foo.*(Int32)" parses "foo = 1; ->foo.*(Int32)" parses "a = /=/" parses "a = /=/" parses "foo(bar { })" parses "foo(bar { })" says syntax error on "foo &.[0]? = 1" says syntax error on "foo &.[0]? = 1" parses "foo = 1; ->foo.foo!" parses "foo = 1; ->foo.foo!" parses "foo(0, n % 2)" parses "foo(0, n % 2)" parses "->Foo.//(Int32)" parses "->Foo.//(Int32)" parses "1 == 2 == 3 == 4" parses "1 == 2 == 3 == 4" parses "foo +1_i64" parses "foo +1_i64" parses ":\"\\\"foo\\\"\"" parses ":\"\\\"foo\\\"\"" says syntax error on "lib Foo; enum Bar->(x : Qux){}" says syntax error on "lib Foo; enum Bar->(x : Qux){}" parses "foo = 1; ->foo.%(Int32)" parses "foo = 1; ->foo.%(Int32)" says syntax error on "break % 1" says syntax error on "break % 1" parses "1 &* 2" parses "1 &* 2" parses "foo = 1; foo {}" parses "foo = 1; foo {}" parses "a\nwhile / /; / /; end" parses "a\nwhile / /; / /; end" says syntax error on "macro foo x y; end" says syntax error on "macro foo x y; end" parses "class Foo 'a' end" parses "class Foo 'a' end" says syntax error on "return false foo" says syntax error on "return false foo" parses "offsetof(X, 1)" parses "offsetof(X, 1)" parses "foo.=~(1, 2)" parses "foo.=~(1, 2)" says syntax error on "foo(foo(&.block)" says syntax error on "foo(foo(&.block)" parses "def foo(a, b = a); end" parses "def foo(a, b = a); end" says syntax error on "foo { |(x, x)| }" says syntax error on "foo { |(x, x)| }" parses "def foo(x @@pointerof); end" parses "def foo(x @@pointerof); end" parses "alias Foo = Bar" parses "alias Foo = Bar" parses "def foo(var : Char[256]); end" parses "def foo(var : Char[256]); end" parses "macro foo(bar! foo); end" parses "macro foo(bar! foo); end" says syntax warning on "foo { |foo, (bar!)| }" says syntax warning on "foo { |foo, (bar!)| }" says syntax error on "foo { |(a b)| }" says syntax error on "foo { |(a b)| }" says syntax error on "return >> 1" says syntax error on "return >> 1" says syntax error on "foo { |(while)| }" says syntax error on "foo { |(while)| }" 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 "def foo(x @@typeof); end" parses "def foo(x @@typeof); end" parses "foo % i()" parses "foo % i()" parses "foo(n * 2)" parses "foo(n * 2)" parses "def self.[]?; end" parses "def self.[]?; end" parses "foo a, / /" parses "foo a, / /" parses "%q{hello \#{foo} world}" parses "%q{hello \#{foo} world}" says syntax error on "def foo(foo private); end" says syntax error on "def foo(foo private); end" parses "foo unless 3" parses "foo unless 3" says syntax error on "lib Foo {|a|a}" says syntax error on "lib Foo {|a|a}" parses "foo { |a, b, | 1 }" parses "foo { |a, b, | 1 }" parses "property abstract : Int32" parses "property abstract : Int32" says syntax error on "def foo=(a,b); end" says syntax error on "def foo=(a,b); end" parses "def foo(@include); end" parses "def foo(@include); end" parses "1 !~ 2" parses "1 !~ 2" parses "require \"foo\"" parses "require \"foo\"" parses "def foo(x : U) forall U; end" parses "def foo(x : U) forall U; end" parses "def []; end" parses "def []; end" parses "select : Int32" parses "select : Int32" parses "puts {{\n1\n}}" parses "puts {{\n1\n}}" says syntax error on "return &+ 1" says syntax error on "return &+ 1" says syntax error on "a.b, c.d() = 1" says syntax error on "a.b, c.d() = 1" parses "break {1 => 2}" parses "break {1 => 2}" says syntax error on "\"hello\" foo" says syntax error on "\"hello\" foo" parses "def foo(offsetof foo); end" parses "def foo(offsetof foo); end" parses "if foo; 1; else; 2; end" parses "if foo; 1; else; 2; end" says syntax error on "class Foo < Bar%()" says syntax error on "class Foo < Bar%()" parses "1.foo do; 1; end" parses "1.foo do; 1; end" parses "/ /; / /" parses "/ /; / /" says syntax error on "foo { |(next)| }" says syntax error on "foo { |(next)| }" parses "foo(n &+ 2)" parses "foo(n &+ 2)" parses "1 ? a : b ? c : 3" parses "1 ? a : b ? c : 3" parses "def foo(x @@begin); end" parses "def foo(x @@begin); end" says syntax error on "break <= 1" says syntax error on "break <= 1" parses "break 1, 2" parses "break 1, 2" says syntax error on "lib Foo; struct Bar%x()" says syntax error on "lib Foo; struct Bar%x()" parses "@@a, b = 1, 2" parses "@@a, b = 1, 2" says syntax warning on "def foo(foo bar!); end" says syntax warning on "def foo(foo bar!); end" parses "def foo(x @struct); end" parses "def foo(x @struct); end" says syntax error on "module Foo%()" says syntax error on "module Foo%()" parses "foo.>=" parses "foo.>=" parses "{a: 1}" parses "{a: 1}" parses "def foo(x @@false); end" parses "def foo(x @@false); end" says syntax error on "foo &.[] 0 = 1" says syntax error on "foo &.[] 0 = 1" parses "def self.!~(); end;" parses "def self.!~(); end;" says syntax error on "class Foo%w()" says syntax error on "class Foo%w()" parses "abstract def foo(x)" parses "abstract def foo(x)" parses "->::Foo.foo!" parses "->::Foo.foo!" parses "case 1\nin nil; 2; end" parses "case 1\nin nil; 2; end" parses "a.[] = 1" parses "a.[] = 1" says syntax error on "lib Foo; union Bar:qux" says syntax error on "lib Foo; union Bar:qux" says syntax error on "module Foo\"a\"" says syntax error on "module Foo\"a\"" says syntax error on "macro foo" says syntax error on "macro foo" parses "property self : Int32" parses "property self : Int32" says syntax error on "foo &.bar.[](0)=(1)" says syntax error on "foo &.bar.[](0)=(1)" parses "a = 1; a >>=\n1" parses "a = 1; a >>=\n1" says syntax error on "return | 1" says syntax error on "return | 1" says syntax error on "1 .. break" says syntax error on "1 .. break" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "a; if / /\n/ /\nelsif / /\n/ /\nend" parses "def foo(@end); end" parses "def foo(@end); end" parses "foo = 1; ->foo.===(Int32)" parses "foo = 1; ->foo.===(Int32)" parses "def foo(@module); end" parses "def foo(@module); end" says syntax error on "break &- 1" says syntax error on "break &- 1" parses "def foo(x); end; x" parses "def foo(x); end; x" parses "def &+(); end" parses "def &+(); end" says syntax error on "enum Foo->(x : Qux){}" says syntax error on "enum Foo->(x : Qux){}" parses "lib LibC\nfun getchar(Int, Float)\nend" parses "lib LibC\nfun getchar(Int, Float)\nend" says syntax error on "next ? 1 : 2" says syntax error on "next ? 1 : 2" parses "asm(\"nop\" : : )" parses "asm(\"nop\" : : )" says syntax error on "struct Foo%()" says syntax error on "struct Foo%()" parses "def foo(end foo); end" parses "def foo(end foo); end" parses "def foo(var : Int -> Double); end" parses "def foo(var : Int -> Double); end" parses "def foo(x @yield); end" parses "def foo(x @yield); end" says syntax error on "def foo(nil); end" says syntax error on "def foo(nil); end" parses "def foo(a, &block : Int, Float -> Double); end" parses "def foo(a, &block : Int, Float -> Double); end" parses "foo = 1; ->foo.&+(Int32)" parses "foo = 1; ->foo.&+(Int32)" sets correct location for fun def with return type sets correct location for fun def with return type says syntax error on "x : String, a = 4" says syntax error on "x : String, a = 4" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nHERE2" says syntax error on "foo { |until| }" says syntax error on "foo { |until| }" parses "break if true" parses "break if true" parses "def foo(@@private); end" parses "def foo(@@private); end" parses "def foo(x @@if); end" parses "def foo(x @@if); end" parses "1 &- 2" parses "1 &- 2" parses "struct Foo :bar end" parses "struct Foo :bar end" parses "foo(a: n ^ 2)" parses "foo(a: n ^ 2)" parses "foo.<= 1, 2" parses "foo.<= 1, 2" says syntax warning on "foo { |bar!| }" says syntax warning on "foo { |bar!| }" parses "def foo(x, *, y, &); 1; end" parses "def foo(x, *, y, &); 1; end" parses "foo(n | 2)" parses "foo(n | 2)" says syntax error on "def foo(foo false); end" says syntax error on "def foo(foo false); end" doesn't override yield with macro yield doesn't override yield with macro yield says syntax error on "annotation Foo {|a|a}" says syntax error on "annotation Foo {|a|a}" says syntax error on "{\n1 => 2\n3 => 4\n}" says syntax error on "{\n1 => 2\n3 => 4\n}" parses "foo.is_a? Const" parses "foo.is_a? Const" parses "a = 1; a[2] &&= 3" parses "a = 1; a[2] &&= 3" parses "foo.+(1, 2)" parses "foo.+(1, 2)" parses "foo \"foo bar\": 1, \"baz\": 2" parses "foo \"foo bar\": 1, \"baz\": 2" parses "case\n1\nwhen 1\n2\nend\nif a\nend" parses "case\n1\nwhen 1\n2\nend\nif a\nend" sets args_in_brackets to false for `a.b` sets args_in_brackets to false for `a.b` says syntax error on "foo { |require| }" says syntax error on "foo { |require| }" parses "a = 1; a /= 1" parses "a = 1; a /= 1" parses "class Foo %w() end" parses "class Foo %w() end" parses "foo /a/" parses "foo /a/" says syntax error on "lib Foo; struct Bar\"a\"" says syntax error on "lib Foo; struct Bar\"a\"" parses "- 1" parses "- 1" says syntax error on "foo { |(class)| }" says syntax error on "foo { |(class)| }" parses "1 -\n2" parses "1 -\n2" parses "/=/" parses "/=/" says syntax error on "next &** 1" says syntax error on "next &** 1" parses "lib LibC; struct Foo; include Bar; end; end" parses "lib LibC; struct Foo; include Bar; end; end" parses "n < 2" parses "n < 2" parses "{% if 1; 2; end; %}" parses "{% if 1; 2; end; %}" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "lib LibC\nfun getchar(a : Int, b : Float) : Int\nend" parses "def foo(@@false); end" parses "def foo(@@false); end" parses "property offsetof : Int32" parses "property offsetof : Int32" says syntax error on "def foo(extend); end" says syntax error on "def foo(extend); end" parses "{% for x in y %}body{% end %}" parses "{% for x in y %}body{% end %}" parses "(foo bar do\nend)" parses "(foo bar do\nend)" parses "foo [1]" parses "foo [1]" says syntax error on "def foo(**args, **args2); end" says syntax error on "def foo(**args, **args2); end" parses "foo /;/" parses "foo /;/" says syntax error on "foo { |case| }" says syntax error on "foo { |case| }" parses "[1,\n 2,]" parses "[1,\n 2,]" says syntax error on "return .. 1" says syntax error on "return .. 1" parses "def foo(x @protected); end" parses "def foo(x @protected); end" says syntax error on "x[1:-2]" says syntax error on "x[1:-2]" parses "1 <= 2 <= 3" parses "1 <= 2 <= 3" says syntax error on "foo { |(out)| }" says syntax error on "foo { |(out)| }" parses "->foo(Void*)" parses "->foo(Void*)" parses "foo *{1}" parses "foo *{1}" parses "->::foo=" parses "->::foo=" says syntax error on "foo { |(nil)| }" says syntax error on "foo { |(nil)| }" says syntax error on "def foo(alias); end" says syntax error on "def foo(alias); end" parses "class Foo include Bar end" parses "class Foo include Bar end" parses "/foo/" parses "/foo/" 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 "A = 1" parses "A = 1" says syntax error on "foo(**bar, *x)" says syntax error on "foo(**bar, *x)" parses "Foo(x: U)" parses "Foo(x: U)" parses "foo = 1; ->foo.**(Int32)" parses "foo = 1; ->foo.**(Int32)" parses "def &-(); end" parses "def &-(); end" says syntax error on "def foo(unless); end" says syntax error on "def foo(unless); end" parses "property def : Int32" parses "property def : Int32" parses "[] of ->;" parses "[] of ->;" parses "@[Foo]" parses "@[Foo]" parses "1+2*3" parses "1+2*3" says syntax error on "{1, 2 3}" says syntax error on "{1, 2 3}" parses "def foo(sizeof foo); end" parses "def foo(sizeof foo); end" parses "case\nwhen true\n1\nend" parses "case\nwhen true\n1\nend" parses "def foo(*y : *T); 1; end" parses "def foo(*y : *T); 1; end" parses "foo %Q" parses "foo %Q" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" parses ":\"\\a\\b\\n\\r\\t\\v\\f\\e\"" parses "struct Foo include Bar end" parses "struct Foo include Bar end" says syntax error on "def foo(*x, **x); end" says syntax error on "def foo(*x, **x); end" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "<<-HERE\r\n One\r\n Zero\r\n HERE" parses "call(foo.as Bar, Baz)" parses "call(foo.as Bar, Baz)" parses "def foo(bar = 1\n); 2; end" parses "def foo(bar = 1\n); 2; end" abbreviated assignment parses "f.x /= 2" parses "f.x /= 2" parses "f.x &*= 2" parses "f.x &*= 2" parses "f.x |= 2" parses "f.x |= 2" parses "f.x >>= 2" parses "f.x >>= 2" parses "f.x -= 2" parses "f.x -= 2" parses "f.x *= 2" parses "f.x *= 2" parses "f.x &+= 2" parses "f.x &+= 2" parses "f.x <<= 2" parses "f.x <<= 2" parses "f.x //= 2" parses "f.x //= 2" parses "f.x += 2" parses "f.x += 2" parses "f.x &= 2" parses "f.x &= 2" parses "f.x &-= 2" parses "f.x &-= 2" parses "f.x %= 2" parses "f.x %= 2" parses "f.x ^= 2" parses "f.x ^= 2" parses "f.x **= 2" parses "f.x **= 2" parses "def foo(@@require); end" parses "def foo(@@require); end" parses "foo[\n1\n]" parses "foo[\n1\n]" says syntax error on "[1 1]" says syntax error on "[1 1]" parses "foo(a: n >> 2)" parses "foo(a: n >> 2)" parses "foo(..2)" parses "foo(..2)" parses "begin; 1; rescue Foo; 2; end" parses "begin; 1; rescue Foo; 2; end" parses "def foo(); 1; rescue; 2; end" parses "def foo(); 1; rescue; 2; end" parses "{% begin %}%w| %s |{% end %}" parses "{% begin %}%w| %s |{% end %}" parses "{% if 1; 2; elsif 3; 4; else; 5; end; 6 %}" parses "{% if 1; 2; elsif 3; 4; else; 5; end; 6 %}" parses "rescue : Int32" parses "rescue : Int32" says syntax error on "{\"\": 1}" says syntax error on "{\"\": 1}" parses "{% begin %}%x( %s ){% end %}" parses "{% begin %}%x( %s ){% end %}" parses "class Foo; end" parses "class Foo; end" parses "foo.>" parses "foo.>" says syntax error on "%w{one}}" says syntax error on "%w{one}}" says syntax error on "foo { |break| }" says syntax error on "foo { |break| }" parses "class Foo :Bar end" parses "class Foo :Bar end" parses "def self.-(); end;" parses "def self.-(); end;" parses "def foo(@[Foo] @var); end" parses "def foo(@[Foo] @var); end" parses "foo (1 + 2), 3" parses "foo (1 + 2), 3" says syntax error on "\n lib LibFoo\n fun foo(x : Int32\n y : Float64)\n end\n " says syntax error on "\n lib LibFoo\n fun foo(x : Int32\n y : Float64)\n end\n " parses "def foo(x : *T -> R); end" parses "def foo(x : *T -> R); end" `class`, `module`, `def`, etc. inside a `def` says syntax error on "def foo\nmodule\nend" says syntax error on "def foo\nmodule\nend" says syntax error on "def foo\nlib\nend" says syntax error on "def foo\nlib\nend" says syntax error on "def foo\ndef\nend" says syntax error on "def foo\ndef\nend" says syntax error on "def foo\nfun\nend" says syntax error on "def foo\nfun\nend" says syntax error on "def foo\nmacro\nend" says syntax error on "def foo\nmacro\nend" says syntax error on "def foo\nclass\nend" says syntax error on "def foo\nclass\nend" says syntax error on "def foo\nabstract\nend" says syntax error on "def foo\nabstract\nend" says syntax error on "def foo\ninclude\nend" says syntax error on "def foo\ninclude\nend" says syntax error on "def foo\nalias\nend" says syntax error on "def foo\nalias\nend" says syntax error on "def foo\nextend\nend" says syntax error on "def foo\nextend\nend" says syntax error on "def foo\nstruct\nend" says syntax error on "def foo\nstruct\nend" parses "{% begin %}%i| %s |{% end %}" parses "{% begin %}%i| %s |{% end %}" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" says syntax error on "def foo(x : Int32 | (Int32, Int32)); end" parses "case 1\nwhen 1\n2\nend" parses "case 1\nwhen 1\n2\nend" parses "_, *_, _, _ = 1, 2, 3" parses "_, *_, _, _ = 1, 2, 3" parses "a = 1\nfoo - a" parses "a = 1\nfoo - a" says syntax error on "case 1; when next; end; end" says syntax error on "case 1; when next; end; end" says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax error on "lib LibC\n$Errno : Int32\nend" says syntax warning on "foo { |foo, (bar?)| }" says syntax warning on "foo { |foo, (bar?)| }" parses "foo[\nfoo[\n1\n]\n]" parses "foo[\nfoo[\n1\n]\n]" parses "foo %x()" parses "foo %x()" says syntax error on "struct Foo:Qux" says syntax error on "struct Foo:Qux" parses "foo(a: n + 2)" parses "foo(a: n + 2)" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" parses "<<-HERE\n \#{1}One\n \#{2}Zero\n HERE" says syntax error on "a = 1; b = 2; a, b += 1, 2" says syntax error on "a = 1; b = 2; a, b += 1, 2" parses "def foo(@begin); end" parses "def foo(@begin); end" parses "puts ::foo" parses "puts ::foo" parses "as(Bar)" parses "as(Bar)" says syntax error on "class Foo; require \"bar\"; end" says syntax error on "class Foo; require \"bar\"; end" says syntax error on "def foo(**args, *x); end" says syntax error on "def foo(**args, *x); end" parses "foo &.as?(T)" parses "foo &.as?(T)" parses "foo.> 1, 2" parses "foo.> 1, 2" says syntax error on "module Foo%w()" says syntax error on "module Foo%w()" says syntax error on "def foo 1; end" says syntax error on "def foo 1; end" parses "foo %q" parses "foo %q" parses "1.responds_to?(\n :foo\n)" parses "1.responds_to?(\n :foo\n)" parses "x.y=(1).to_s" parses "x.y=(1).to_s" parses "def foo(@self); end" parses "def foo(@self); end" parses "def foo(x @@class); end" parses "def foo(x @@class); end" parses "foo &.as(T).bar" parses "foo &.as(T).bar" says syntax error on "a, b.<=" says syntax error on "a, b.<=" says syntax error on "foo { |if| }" says syntax error on "foo { |if| }" says syntax error on "a, b, *c, d = 1, 2" says syntax error on "a, b, *c, d = 1, 2" parses "{% begin %}%r{\\A}{% end %}" parses "{% begin %}%r{\\A}{% end %}" parses "/ /\n/ /" parses "/ /\n/ /" says syntax error on "a.b() = 1" says syntax error on "a.b() = 1" says syntax error on "def foo=(*args); end" says syntax error on "def foo=(*args); end" parses "1.!" parses "1.!" parses "foo[*baz]" parses "foo[*baz]" parses "def foo(a, @[Foo] var); end" parses "def foo(a, @[Foo] var); end" says syntax error on "def foo(enum); end" says syntax error on "def foo(enum); end" says syntax error on "case 1; when return; end; end" says syntax error on "case 1; when return; end; end" says syntax error on "offsetof(X, 1.0)" says syntax error on "offsetof(X, 1.0)" parses "->Foo.&(Int32)" parses "->Foo.&(Int32)" says syntax error on "foo &.bar.[](0) = 1" says syntax error on "foo &.bar.[](0) = 1" parses "def foo(@var = 1); 1; end" parses "def foo(@var = 1); 1; end" says syntax error on "enum Foo; A B; end" says syntax error on "enum Foo; A B; end" parses "def foo(asm foo); end" parses "def foo(asm foo); end" says syntax error on "def foo(*a foo); end" says syntax error on "def foo(*a foo); end" parses "Foo({X, Y,})" parses "Foo({X, Y,})" parses "foo &.block[0] = 1" parses "foo &.block[0] = 1" parses "->foo=" parses "->foo=" says syntax error on "a.[]() = 1" says syntax error on "a.[]() = 1" parses "%w{one\\ two}" parses "%w{one\\ two}" parses "a = 1; a &= 1" parses "a = 1; a &= 1" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "asm(\"nop\" ::: \"\#{foo}\")" says syntax error on "def foo(while); end" says syntax error on "def foo(while); end" parses "1 + 2" parses "1 + 2" says syntax error on "@foo :: Foo" says syntax error on "@foo :: Foo" says syntax error on "foo { |(abstract)| }" says syntax error on "foo { |(abstract)| }" parses "def /; end;" parses "def /; end;" says syntax error on "lib Foo; enum Bar{|a|a}" says syntax error on "lib Foo; enum Bar{|a|a}" says syntax error on "yield return" says syntax error on "yield return" parses "Foo(x: U, y: V)" parses "Foo(x: U, y: V)" parses "[] of ->\n" parses "[] of ->\n" says syntax error on "def foo(false); end" says syntax error on "def foo(false); end" parses "alias Foo::Bar = Baz" parses "alias Foo::Bar = Baz" parses "foo(x: result : Int32); result" parses "foo(x: result : Int32); result" sets correct location of named tuple type sets correct location of named tuple type parses "enum Foo; A\nB; C\nD = 1; end" parses "enum Foo; A\nB; C\nD = 1; end" parses "def foo(var : self); end" parses "def foo(var : self); end" parses "foo(0, n + 2)" parses "foo(0, n + 2)" says syntax error on "class Foo[1]" says syntax error on "class Foo[1]" parses "\"foo\#{\"bar\"}baz\"" parses "\"foo\#{\"bar\"}baz\"" parses "case 1\nwhen .as(T)\n2\nend" parses "case 1\nwhen .as(T)\n2\nend" parses "def foo(a); a; end" parses "def foo(a); a; end" says syntax error on "while break; end" says syntax error on "while break; end" says syntax error on "def foo(var = 1 : Int32); end" says syntax error on "def foo(var = 1 : Int32); end" 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 "case {1}\nin {_}; 2; end" parses "case {1}\nin {_}; 2; end" parses "1 rescue 2" parses "1 rescue 2" says syntax error on "'a' foo" says syntax error on "'a' foo" parses "Foo(T, 1, U)" parses "Foo(T, 1, U)" says syntax error on "foo 1," says syntax error on "foo 1," says syntax error on "macro foo(\"\" y); end" says syntax error on "macro foo(\"\" y); end" says syntax error on "def foo(foo break); end" says syntax error on "def foo(foo break); end" parses "@[Foo::Bar]" parses "@[Foo::Bar]" says syntax error on "foo(\"bar\" \"baz\")" says syntax error on "foo(\"bar\" \"baz\")" parses "foo./ do end" parses "foo./ do end" says syntax error on " {1 => end" says syntax error on " {1 => end" parses "def foo(struct foo); end" parses "def foo(struct foo); end" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" says syntax error on "asm(\"nop\" :::: \"\#{volatile}\")" parses "foo.[0] = 1" parses "foo.[0] = 1" parses "foo = 1; ->foo.|(Int32)" parses "foo = 1; ->foo.|(Int32)" parses "1.[]?(2)" parses "1.[]?(2)" parses "def foo(@@macro); end" parses "def foo(@@macro); end" parses "a.b &-=\n1" parses "a.b &-=\n1" parses "foo.-" parses "foo.-" parses ":>=" parses ":>=" parses "1 &** 2" parses "1 &** 2" says syntax error on "{a: 1, b: 2 c: 3}" says syntax error on "{a: 1, b: 2 c: 3}" parses "\"hello \\\r\n world\"" parses "\"hello \\\r\n world\"" says syntax error on "lib Foo; struct Bar->(x : Qux){}" says syntax error on "lib Foo; struct Bar->(x : Qux){}" parses "+ 1" parses "+ 1" parses "a.b **=\n1" parses "a.b **=\n1" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" gets correct location after macro with yield gets correct location after macro with yield parses "macro foo=;end" parses "macro foo=;end" parses "foo(z: 0, a: n << 2)" parses "foo(z: 0, a: n << 2)" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "enum Foo; A = 1\ndef self.foo; 1; end\nend" parses "foo(z: 0, a: n & 2)" parses "foo(z: 0, a: n & 2)" says syntax error on "class Foo < Bar'a'" says syntax error on "class Foo < Bar'a'" parses "foo.bar= *baz" parses "foo.bar= *baz" parses "def foo(x = / /); end" parses "def foo(x = / /); end" parses "case 1; when 1 then 2; else; 3; end" parses "case 1; when 1 then 2; else; 3; end" parses "(bar do\nend)" parses "(bar do\nend)" parses "->::foo" parses "->::foo" parses "def foo(x @@lib); end" parses "def foo(x @@lib); end" says syntax error on "def foo; A = 1; end" says syntax error on "def foo; A = 1; end" parses "a = 1; a **= 1" parses "a = 1; a **= 1" parses "def foo(yield foo); end" parses "def foo(yield foo); end" says syntax error on "foo { |(protected)| }" says syntax error on "foo { |(protected)| }" says syntax error on "foo(**bar, out x)" says syntax error on "foo(**bar, out x)" says syntax error on "macro foo(x\n,y); 1; end" says syntax error on "macro foo(x\n,y); 1; 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 foo(x @self); end" parses "def foo(x @self); end" says syntax error on "yield next" says syntax error on "yield next" parses "foo.==(1, 2)" parses "foo.==(1, 2)" parses "foo.as(Bar)" parses "foo.as(Bar)" parses "foo.*(1, 2)" parses "foo.*(1, 2)" parses "foo.is_a?(Foo | Bar)" parses "foo.is_a?(Foo | Bar)" says syntax error on "foo[0]? = 1" says syntax error on "foo[0]? = 1" says syntax error on "def foo(sizeof); end" says syntax error on "def foo(sizeof); end" parses "def foo(unless foo); end" parses "def foo(unless foo); end" says syntax error on "lib Foo:Qux" says syntax error on "lib Foo:Qux" parses "Foo(X, sizeof(Int32))" parses "Foo(X, sizeof(Int32))" parses "self : Int32" parses "self : Int32" parses "foo(/ /, / /)" parses "foo(/ /, / /)" parses "{% if 1; 2; end; 3 %}" parses "{% if 1; 2; end; 3 %}" parses "def self.!=; end;" parses "def self.!=; end;" parses "next {1 => 2}" parses "next {1 => 2}" parses "{% begin %}%w[ %s ]{% end %}" parses "{% begin %}%w[ %s ]{% end %}" sets correct location of protected macro in enum sets correct location of protected macro in enum parses "def self.*(); end;" parses "def self.*(); end;" parses "a.b / 2" parses "a.b / 2" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" parses "x, y = <<-FOO, <<-BAR\nhello\nFOO\nworld\nBAR" single splats inside container literals says syntax error on "{*1 => 2}" says syntax error on "{*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 "[1, *2]" parses "[1, *2]" parses "{*1}" parses "{*1}" parses "Set {*1, 2, *3}" parses "Set {*1, 2, *3}" parses "[*1, *2]" parses "[*1, *2]" parses "x = {*1}" parses "x = {*1}" says syntax error on "{1 => 2, *3}" says syntax error on "{1 => 2, *3}" says syntax error on "case {1}\nwhen {*2}; 3; end" says syntax error on "case {1}\nwhen {*2}; 3; end" says syntax error on "{*a: 1}" says syntax error on "{*a: 1}" parses "[*1 ** 2]" parses "[*1 ** 2]" parses "{*1 * 2}" parses "{*1 * 2}" parses "[*1]" parses "[*1]" parses "{*1, *2}" parses "{*1, *2}" parses "{*1, 2}" parses "{*1, 2}" parses "Set {*{1} * 2}" parses "Set {*{1} * 2}" parses "{1, *2, 3, *4, 5}" parses "{1, *2, 3, *4, 5}" parses "case 1\nwhen {*2}; 3; end" parses "case 1\nwhen {*2}; 3; end" says syntax error on "{a: 1, *2}" says syntax error on "{a: 1, *2}" parses "{1, *2}" parses "{1, *2}" parses "[*[*[1]], *[2]]" parses "[*[*[1]], *[2]]" parses "[*1, 2]" parses "[*1, 2]" parses "foo x, y do\nend" parses "foo x, y do\nend" parses "module Foo {1} end" parses "module Foo {1} end" sets correct location of var in macro for loop sets correct location of var in macro for loop says syntax error on "def foo(x, **x); end" says syntax error on "def foo(x, **x); end" says syntax error on "def foo(class); end" says syntax error on "def foo(class); end" parses "<<-SOME\n Sa\n Se\n SOME" parses "<<-SOME\n Sa\n Se\n SOME" parses "def foo : Int32\n1\nend" parses "def foo : Int32\n1\nend" says syntax error on "def foo(foo alias); end" says syntax error on "def foo(foo alias); end" parses "a, b, *c = 1, 2" parses "a, b, *c = 1, 2" parses "@a : Foo | Int32" parses "@a : Foo | Int32" says syntax error on "def foo(**args, x); end" says syntax error on "def foo(**args, x); end" says syntax error on "{a: 1 b: 2}" says syntax error on "{a: 1 b: 2}" parses "begin\n1\nend\nif true; end" parses "begin\n1\nend\nif true; end" parses "def foo(@[Foo] var : Int32); end" parses "def foo(@[Foo] var : Int32); end" parses "{foo:'a', bar:'b'}" parses "{foo:'a', bar:'b'}" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "Foo(\nx:\nT,\ny:\nU,\n)" parses "def foo(x @@out); end" parses "def foo(x @@out); end" parses "{% begin %}%x< %s >{% end %}" parses "{% begin %}%x< %s >{% end %}" says syntax error on "1 if return" says syntax error on "1 if return" parses "foo = 1; foo(-1)" parses "foo = 1; foo(-1)" parses "/ /" parses "/ /" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ex : ::Foo | ::Bar; 2; end" parses "*_ = 1, 2" parses "*_ = 1, 2" parses ":==" parses ":==" parses "{\n1,\n2\n}" parses "{\n1,\n2\n}" parses "<<-FOO\n\t1\n\tFOO" parses "<<-FOO\n\t1\n\tFOO" gets correct location after macro with yield gets correct location after macro with yield parses "case 1\nin Int32.class; 2; end" parses "case 1\nin Int32.class; 2; end" parses "foo(a: n | 2)" parses "foo(a: n | 2)" parses "\"foo\"" parses "\"foo\"" says syntax error on "lib Foo; union Bar->{}" says syntax error on "lib Foo; union Bar->{}" says syntax error on "next .. 1" says syntax error on "next .. 1" says syntax error on "next & 1" says syntax error on "next & 1" parses "<<-FOO\n \t1\n \tFOO" parses "<<-FOO\n \t1\n \tFOO" parses "def foo(var : self.class); end" parses "def foo(var : self.class); end" parses "def foo(@fun); end" parses "def foo(@fun); end" parses ":/" parses ":/" says syntax error on "foo { |x, (x)| }" says syntax error on "foo { |x, (x)| }" parses "def foo(x @@with); end" parses "def foo(x @@with); end" parses "macro foo;bar{% begin %}body{% end %}baz;end" parses "macro foo;bar{% begin %}body{% end %}baz;end" says syntax error on "class Foo < Bar:qux" says syntax error on "class Foo < Bar:qux" says syntax error on "macro foo x\n 1 + 2; end" says syntax error on "macro foo x\n 1 + 2; end" says syntax error on "if next; end" says syntax error on "if next; end" parses "foo.!~" parses "foo.!~" parses "foo.<" parses "foo.<" says syntax error on "def foo(lib); end" says syntax error on "def foo(lib); end" parses "call(foo : A, end : B)" parses "call(foo : A, end : B)" parses "Foo(\nT,\nU,\n)" parses "Foo(\nT,\nU,\n)" says syntax error on "next.as(Int32)" says syntax error on "next.as(Int32)" parses "foo &.[0]" parses "foo &.[0]" says syntax error on "def foo(&a foo); end" says syntax error on "def foo(&a foo); end" sets correct location of tuple type sets correct location of tuple type parses "lib LibC\n@[Bar]; end" parses "lib LibC\n@[Bar]; end" says syntax error on "def foo(instance_sizeof); end" says syntax error on "def foo(instance_sizeof); end" says syntax error on "foo { |(instance_sizeof)| }" says syntax error on "foo { |(instance_sizeof)| }" parses "@[Foo(1)]" parses "@[Foo(1)]" parses "foo.^" parses "foo.^" parses "foo(n ^ 2)" parses "foo(n ^ 2)" parses "{\"foo\": 1}" parses "{\"foo\": 1}" parses "def self.+(); end;" parses "def self.+(); end;" says syntax error on "struct Foo%x()" says syntax error on "struct Foo%x()" parses "do : Int32" parses "do : Int32" parses "a = 1; a **=\n1" parses "a = 1; a **=\n1" parses ":&**" parses ":&**" says syntax error on "break ** 1" says syntax error on "break ** 1" parses "def foo(x @alias); end" parses "def foo(x @alias); end" parses "__DIR__" parses "__DIR__" parses "a = 1; a rescue a" parses "a = 1; a rescue a" parses "foo.%(1, 2)" parses "foo.%(1, 2)" parses "def -; end;" parses "def -; end;" parses "->Foo.<=(Int32)" parses "->Foo.<=(Int32)" parses "/ hi /" parses "/ hi /" parses "property struct : Int32" parses "property struct : Int32" parses "def []?; end" parses "def []?; end" parses "a = 1; a &-=\n1" parses "a = 1; a &-=\n1" parses "->Foo::Bar::Baz.foo" parses "->Foo::Bar::Baz.foo" parses "->(x) { x }" parses "->(x) { x }" parses "begin; 1; rescue ::Foo; 2; end" parses "begin; 1; rescue ::Foo; 2; end" says syntax error on "foo.[0]? = 1" says syntax error on "foo.[0]? = 1" parses "@[Foo(\n1, foo: 2\n)]" parses "@[Foo(\n1, foo: 2\n)]" parses "property private : Int32" parses "property private : Int32" parses "foo(&.block)" parses "foo(&.block)" says syntax error on "offsetof(X, 'c')" says syntax error on "offsetof(X, 'c')" parses "instance_alignof(X)" parses "instance_alignof(X)" parses "qux \"foo\#{bar do end}baz\"" parses "qux \"foo\#{bar do end}baz\"" 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 "a : Foo[12]" parses "a : Foo[12]" 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(&block); end" parses "def foo(&block); end" says syntax error on "struct Foo[1]" says syntax error on "struct Foo[1]" parses "def self.<; end;" parses "def self.<; end;" says syntax error on "break.foo" says syntax error on "break.foo" parses "macro x\n%{}\nend" parses "macro x\n%{}\nend" says syntax error on "a b: 0 = 1" says syntax error on "a b: 0 = 1" says syntax error on "enum Foo : Int32:Qux" says syntax error on "enum Foo : Int32:Qux" parses "foo 1, 2" parses "foo 1, 2" parses "a = 1; a -= 1" parses "a = 1; a -= 1" parses "lib LibC; fun foo(a : Int*); end" parses "lib LibC; fun foo(a : Int*); end" parses "foo%q" parses "foo%q" says syntax error on "def foo(foo nil); end" says syntax error on "def foo(foo nil); end" parses "a, b = 1" parses "a, b = 1" parses "module Foo; end" parses "module Foo; end" sets correct location of `else` of if statement sets correct location of `else` of if statement parses "property instance_sizeof : Int32" parses "property instance_sizeof : Int32" parses "@@foo = 1" parses "@@foo = 1" parses "foo = 1; ->foo.-(Int32)" parses "foo = 1; ->foo.-(Int32)" says syntax error on "foo { |(with)| }" says syntax error on "foo { |(with)| }" says syntax error on "{foo: 1\nbar: 2}" says syntax error on "{foo: 1\nbar: 2}" says syntax error on "break[0]" says syntax error on "break[0]" says syntax error on "struct Foo {|a|a}" says syntax error on "struct Foo {|a|a}" parses "->@foo.foo=" parses "->@foo.foo=" parses "def foo(@@alias); end" parses "def foo(@@alias); end" parses "macro foo(**args)\n1\nend" parses "macro foo(**args)\n1\nend" says syntax error on "foo &.[]?=(1)" says syntax error on "foo &.[]?=(1)" parses "foo begin\nbar do\nend\nend" parses "foo begin\nbar do\nend\nend" says syntax error on "next === 1" says syntax error on "next === 1" parses "%i((one two))" parses "%i((one two))" says syntax error on "a = return" says syntax error on "a = return" parses "%x(`which(foo)`)" parses "%x(`which(foo)`)" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "lib LibC; fun getchar(a : Int, b : Float) : Int; end" parses "1 if /x/" parses "1 if /x/" sets correct location of annotation on method parameter sets correct location of annotation on method parameter parses "foo.< 1, 2" parses "foo.< 1, 2" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" parses "<<-HERE1; <<-HERE2\nhere1\nHERE1\nHERE2" says syntax error on "foo { |(unless)| }" says syntax error on "foo { |(unless)| }" says syntax error on "lib Foo[1]" says syntax error on "lib Foo[1]" parses "typeof(a = 1); a" parses "typeof(a = 1); a" parses "def foo(var : self?); end" parses "def foo(var : self?); end" says syntax error on "def foo(def); end" says syntax error on "def foo(def); end" parses "class Foo %x() end" parses "class Foo %x() end" parses "def foo(x @@until); end" parses "def foo(x @@until); end" parses "foo.* do end" parses "foo.* do end" parses "def foo(@@offsetof); end" parses "def foo(@@offsetof); end" parses "{} of Int32 -> Int32 => Int32" parses "{} of Int32 -> Int32 => Int32" parses "class Foo(T); end" parses "class Foo(T); end" says syntax error on "def foo(private); end" says syntax error on "def foo(private); end" parses "case :foo; when :bar; 2; end" parses "case :foo; when :bar; 2; end" parses "foo(n &* 2)" parses "foo(n &* 2)" says syntax error on "foo { |(end)| }" says syntax error on "foo { |(end)| }" says syntax error on "foo { |(struct)| }" says syntax error on "foo { |(struct)| }" parses "macro foo(a, @[Foo] var);end" parses "macro foo(a, @[Foo] var);end" sets correct location of call name in operator assignment sets correct location of call name in operator assignment says syntax error on "nil foo" says syntax error on "nil foo" parses "foo x do\nend" parses "foo x do\nend" says syntax error on "break < 1" says syntax error on "break < 1" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" says syntax error on "{foo: 1, bar: 2\nbaz: 3}" says syntax error on "class Foo < Bar {|a|a}" says syntax error on "class Foo < Bar {|a|a}" parses "def foo(@@enum); end" parses "def foo(@@enum); end" says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "case {1, 2}; when {3}; 4; end" says syntax error on "def foo; require \"bar\"; end" says syntax error on "def foo; require \"bar\"; end" parses "a = 1; b = 2; c = 3; a-b-c" parses "a = 1; b = 2; c = 3; a-b-c" parses "property else : Int32" parses "property else : Int32" parses "case 1; when 2 then /foo/; end" parses "case 1; when 2 then /foo/; end" says syntax error on "foo(a: 1\n,b: 2)" says syntax error on "foo(a: 1\n,b: 2)" parses "asm(\"nop\" :::: \"volatile\")" parses "asm(\"nop\" :::: \"volatile\")" says syntax error on "foo { |(asm)| }" says syntax error on "foo { |(asm)| }" parses "typeof(1)" parses "typeof(1)" parses "def foo(@@self); end" parses "def foo(@@self); end" parses "1 =~ 2" parses "1 =~ 2" parses "{% begin %}%x[ %s ]{% end %}" parses "{% begin %}%x[ %s ]{% end %}" says syntax error on "class Foo < Bar->(x : Qux){}" says syntax error on "class Foo < Bar->(x : Qux){}" parses ":%" parses ":%" parses "foo(a: n == 2)" parses "foo(a: n == 2)" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "case a\nwhen b\n/ /\n\nelse\n/ /\nend" parses "foo.!= do end" parses "foo.!= do end" parses "break {1, 2}" parses "break {1, 2}" 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 "break.as(Int32)" says syntax error on "break.as(Int32)" says syntax error on " (1, 2, 3 end" says syntax error on " (1, 2, 3 end" says syntax error on "foo { |class| }" says syntax error on "foo { |class| }" parses "def self.foo()\n1\nend" parses "def self.foo()\n1\nend" parses "def foo(fun foo); end" parses "def foo(fun foo); end" parses "lib LibC\nfun SomeFun\nend" parses "lib LibC\nfun SomeFun\nend" parses "lib LibC\nend" parses "lib LibC\nend" parses "1 << 2" parses "1 << 2" parses "{% begin %}%x{ %s }{% end %}" parses "{% begin %}%x{ %s }{% end %}" parses "b.c ||= 1" parses "b.c ||= 1" says syntax error on "annotation Foo{|a|a}" says syntax error on "annotation Foo{|a|a}" parses "def `(cmd); 1; end" parses "def `(cmd); 1; end" says syntax error on "def foo :String\nend" says syntax error on "def foo :String\nend" says syntax error on "case 1\nwhen .=(2)" says syntax error on "case 1\nwhen .=(2)" parses "abstract : Int32" parses "abstract : Int32" parses "->@@foo.foo=" parses "->@@foo.foo=" parses "foo.% 1, 2" parses "foo.% 1, 2" parses "foo = 1; ->foo.<=(Int32)" parses "foo = 1; ->foo.<=(Int32)" parses "foo.== 1, 2" parses "foo.== 1, 2" parses "a ? 1\n : b" parses "a ? 1\n : b" parses "foo(0, n =~ 2)" parses "foo(0, n =~ 2)" parses "foo(0, n &- 2)" parses "foo(0, n &- 2)" parses "def foo(@while); end" parses "def foo(@while); end" says syntax error on "def foo(require); end" says syntax error on "def foo(require); end" parses "foo x, *bar" parses "foo x, *bar" parses "select\nwhen foo\n2\nwhen bar\n4\nend" parses "select\nwhen foo\n2\nwhen bar\n4\nend" parses "foo(*bar)" parses "foo(*bar)" parses "{1.. => 2};" parses "{1.. => 2};" parses "lib LibC\nfun getchar(...)\nend" parses "lib LibC\nfun getchar(...)\nend" parses ":foo" parses ":foo" says syntax error on "if return; end" says syntax error on "if return; end" parses "def foo(x, *, y); 1; end" parses "def foo(x, *, y); 1; end" says syntax error on "a.b {}, c = 1" says syntax error on "a.b {}, c = 1" parses "foo.nil?" parses "foo.nil?" says syntax error on "return &* 1" says syntax error on "return &* 1" parses "\"hello \" \\\r\n \"world\"" parses "\"hello \" \\\r\n \"world\"" parses "foo a: 1, b: 2" parses "foo a: 1, b: 2" parses "self" parses "self" says syntax error on "1 until 3" says syntax error on "1 until 3" parses "a, b = 1, 2" parses "a, b = 1, 2" parses "foo 1\n" parses "foo 1\n" 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 "case 1\nwhen 1\n2\nelse\n3\nend" parses "case 1\nwhen 1\n2\nelse\n3\nend" parses "def >; end;" parses "def >; end;" says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "<<-FOO\n1\nFOO + 2" says syntax error on "b! = 1" says syntax error on "b! = 1" sets correct location of var in type declaration sets correct location of var in type declaration parses "x[1, ..2]" parses "x[1, ..2]" parses "foo = 1; ->foo.=~(Int32)" parses "foo = 1; ->foo.=~(Int32)" says syntax error on "module Foo->{}" says syntax error on "module Foo->{}" parses "foo.bar(1, 2)" parses "foo.bar(1, 2)" says syntax error on "def foo(foo with); end" says syntax error on "def foo(foo with); end" parses "1+0" parses "1+0" parses "foo(Bar) { 1 }" parses "foo(Bar) { 1 }" parses "1 >= 2" parses "1 >= 2" says syntax error on "break ... 1" says syntax error on "break ... 1" block associativity surprise three: arguments affect block binding (#15303) parses "a b c d e 1, 2 {}" parses "a b c d e 1, 2 {}" parses "a b c d e 1, 2 do; end" parses "a b c d e 1, 2 do; end" surprise one: binds to second-to-the-right (#15303) parses "a b c d e do; end" parses "a b c d e do; end" parses "a b c d e {}" parses "a b c d e {}" surprise four: parentheses affect block binding (#15303) parses "a 1, (2), b do end" parses "a 1, (2), b do end" parses "a 1, (2), b {}" parses "a 1, (2), b {}" surprise two: block chains bind right-to-left starting from second-to-the-right (#15303) parses "a b c d e do 1 end do 2 end { 3 } do 4 end" parses "a b c d e do 1 end do 2 end { 3 } do 4 end" parses "a b c d e { 1 } { 2 } do 3 end { 4 }" parses "a b c d e { 1 } { 2 } do 3 end { 4 }" parses "macro foo;bar(end: 1);end" parses "macro foo;bar(end: 1);end" parses "foo.+ do end" parses "foo.+ do end" says syntax error on "macro !;end" says syntax error on "macro !;end" parses "def foo(a, &block : self -> self); end" parses "def foo(a, &block : self -> self); end" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "case {1, 2}\nwhen {3, 4}\n5\nend" parses "foo(out @x); @x" parses "foo(out @x); @x" parses "foo %w" parses "foo %w" says syntax error on "enum Foo : Int32{|a|a}" says syntax error on "enum Foo : Int32{|a|a}" parses "::foo" parses "::foo" says syntax error on "foo { |unless| }" says syntax error on "foo { |unless| }" parses "->Foo.foo" parses "->Foo.foo" parses "->Foo.>>(Int32)" parses "->Foo.>>(Int32)" parses "x.foo a: 1, b: 2 " parses "x.foo a: 1, b: 2 " parses "def self.*; end;" parses "def self.*; end;" says syntax error on "return & 1" says syntax error on "return & 1" says syntax error on "return + 1" says syntax error on "return + 1" parses "f ->{ a do\n end\n }" parses "f ->{ a do\n end\n }" says syntax error on "def foo(foo unless); end" says syntax error on "def foo(foo unless); end" parses "def self./(); end;" parses "def self./(); end;" parses "Int[]" parses "Int[]" parses "def foo(@@while); end" parses "def foo(@@while); end" says syntax error on "lib Foo; union Bar%()" says syntax error on "lib Foo; union Bar%()" parses "return {1, 2}" parses "return {1, 2}" says syntax error on "x--" says syntax error on "x--" says syntax error on "enum Foo : Int32->(x : Qux){}" says syntax error on "enum Foo : Int32->(x : Qux){}" says syntax error on "A = B = 1" says syntax error on "A = B = 1" parses "*a.foo, a.bar = 1" parses "*a.foo, a.bar = 1" parses "a.b //=\n1" parses "a.b //=\n1" says syntax error on "%i(" says syntax error on "%i(" parses "def >(); end" parses "def >(); end" parses "[..2]" parses "[..2]" parses "def foo=(value); end" parses "def foo=(value); end" parses "->Foo.*(Int32)" parses "->Foo.*(Int32)" parses "foo(z: 0, a: n + 2)" parses "foo(z: 0, a: n + 2)" correctly computes line number after `\{% ` (#9857) correctly computes line number after `\{% ` (#9857) says syntax error on "a.[] 0 = 1" says syntax error on "a.[] 0 = 1" says syntax error on "class Foo < Bar[1]" says syntax error on "class Foo < Bar[1]" parses "return : Int32" parses "return : Int32" parses "Foo({->})" parses "Foo({->})" parses "def &**(); end" parses "def &**(); end" says syntax error on "lib Foo; union Bar%x()" says syntax error on "lib Foo; union Bar%x()" says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "{\"a\": 1, \"b\" : 2}" says syntax error on "def foo(foo typeof); end" says syntax error on "def foo(foo typeof); end" parses "&- 1" parses "&- 1" says syntax error on "module Foo {|a|a}" says syntax error on "module Foo {|a|a}" parses "a() /3" parses "a() /3" says syntax error on "{\"foo\" => 1, \"bar\": 2}" says syntax error on "{\"foo\" => 1, \"bar\": 2}" says syntax error on "def foo &block : Int -> Double ; end" says syntax error on "def foo &block : Int -> Double ; end" parses "{% begin %}%Q[ %s ]{% end %}" parses "{% begin %}%Q[ %s ]{% end %}" parses "Foo({\"foo bar\": X})" parses "Foo({\"foo bar\": X})" parses "1 +2.0" parses "1 +2.0" parses "x = 1; foo x { }" parses "x = 1; foo x { }" parses "sizeof(X)" parses "sizeof(X)" parses "foo = 1; foo(+1)" parses "foo = 1; foo(+1)" parses ":foo?" parses ":foo?" sets correct location of call name sets correct location of call name parses "include Foo" parses "include 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" parses "def foo(var : (Int, Float) -> Double); end" parses "def foo(var : (Int, Float) -> Double); end" parses "foo.[]=(1, 2) { 3 }" parses "foo.[]=(1, 2) { 3 }" parses "def ==; end;" parses "def ==; end;" parses "macro foo;bar{% if x %}body{% elsif y %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% elsif y %}body2{%end%}baz;end" parses "def foo; 1; 2; end" parses "def foo; 1; 2; end" parses "case\nend" parses "case\nend" gets correct location of empty exception handler inside def gets correct location of empty exception handler inside def parses "foo.bar.baz" parses "foo.bar.baz" parses "foo.=~ do end" parses "foo.=~ do end" parses "{[] of Foo, self.foo}" parses "{[] of Foo, self.foo}" parses "foo.**(1, 2)" parses "foo.**(1, 2)" parses "def foo(@@true); end" parses "def foo(@@true); end" parses "{{a = 1 if 2}}" parses "{{a = 1 if 2}}" parses "pointerof(@a)" parses "pointerof(@a)" parses "def foo(class foo); end" parses "def foo(class foo); end" parses "foo(bar do\nend)" parses "foo(bar do\nend)" parses "%w{\n}" parses "%w{\n}" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo -b" parses "def foo(x)\n x\nend; foo = 1; b = 2; foo -b" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "case 1\nwhen .is_a?(T)\n2\nend" parses "foo &.baz.qux do\nend" parses "foo &.baz.qux do\nend" parses "foo(bar?)" parses "foo(bar?)" says syntax error on "next <= 1" says syntax error on "next <= 1" parses "foo.>=(1, 2)" parses "foo.>=(1, 2)" parses "var.@foo" parses "var.@foo" says syntax error on "{1\n,2}" says syntax error on "{1\n,2}" parses "def foo(extend foo); end" parses "def foo(extend foo); end" parses "{1 =>\n2, 3 =>\n4}" parses "{1 =>\n2, 3 =>\n4}" says syntax error on "case x; when 1, _; end" says syntax error on "case x; when 1, _; end" says syntax error on "foo.[0]? += 1" says syntax error on "foo.[0]? += 1" parses "<<-EOF.x\n foo\nEOF" parses "<<-EOF.x\n foo\nEOF" parses ":[]=" parses ":[]=" parses "foo &.block[] = 1" parses "foo &.block[] = 1" parses "def foo(@abstract); end" parses "def foo(@abstract); end" parses "Foo??" parses "Foo??" says syntax error on "enum Foo:qux" says syntax error on "enum Foo:qux" parses "def foo(var : Int*); end" parses "def foo(var : Int*); end" parses "/fo\#{1}o/" parses "/fo\#{1}o/" says syntax error on "class Foo:Qux" says syntax error on "class Foo:Qux" parses "Int" parses "Int" says syntax error on "def foo(asm); end" says syntax error on "def foo(asm); end" parses "foo ..2" parses "foo ..2" parses "puts {{1}}" parses "puts {{1}}" parses "foo &.block" parses "foo &.block" says syntax error on "foo[break]" says syntax error on "foo[break]" parses "{1}" parses "{1}" parses "extend Foo\nif true; end" parses "extend Foo\nif true; end" parses "foo.*(1, 2) { 3 }" parses "foo.*(1, 2) { 3 }" parses "foo.[]=" parses "foo.[]=" parses "private def foo; end" parses "private def foo; end" parses "def foo(x @if); end" parses "def foo(x @if); end" parses "@foo = 1" parses "@foo = 1" parses "foo.**" parses "foo.**" parses "n !~ 2" parses "n !~ 2" parses "def /(); end;" parses "def /(); end;" parses "1 * 2" parses "1 * 2" says syntax error on "macro def foo : String; 1; end" says syntax error on "macro def foo : String; 1; end" says syntax error on "foo { |select| }" says syntax error on "foo { |select| }" parses "1 .. 2" parses "1 .. 2" parses "foo(n === 2)" parses "foo(n === 2)" parses "Foo(X, offsetof(Foo, @a))" parses "Foo(X, offsetof(Foo, @a))" parses "foo(a: n / 2)" parses "foo(a: n / 2)" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "lib LibC\nfun getchar(a : Int, b : Float)\nend" parses "foo(z: 0, a: n / 2)" parses "foo(z: 0, a: n / 2)" says syntax error on "class Foo < Bar{1}" says syntax error on "class Foo < Bar{1}" says syntax error on "foo **bar, out x" says syntax error on "foo **bar, out x" parses "foo(&.!)" parses "foo(&.!)" parses "break 1 if true" parses "break 1 if true" parses "foo(0, n & 2)" parses "foo(0, n & 2)" says syntax error on "foo { |with| }" says syntax error on "foo { |with| }" sets correct location of global path in annotation sets correct location of global path in annotation sets location of obj.x += as call sets location of obj.x += as call says syntax error on "foo { |(case)| }" says syntax error on "foo { |(case)| }" parses "a = 1; a +=\n1" parses "a = 1; a +=\n1" parses "if foo.responds_to? :foo\nx = 1\nend" parses "if foo.responds_to? :foo\nx = 1\nend" parses "def foo(x @begin); end" parses "def foo(x @begin); end" says syntax error on "<<-HEREDOC" says syntax error on "<<-HEREDOC" says syntax warning on "foo do |(bar!)|\nend" says syntax warning on "foo do |(bar!)|\nend" parses "Foo(\nT\n)" parses "Foo(\nT\n)" parses "def foo(x @include); end" parses "def foo(x @include); end" parses "lib LibC; struct Foo; x : Int*; end end" parses "lib LibC; struct Foo; x : Int*; end end" parses "macro [];end" parses "macro [];end" parses "Int[8]" parses "Int[8]" says syntax error on "foo { |struct| }" says syntax error on "foo { |struct| }" parses "def **; end;" parses "def **; end;" parses "foo(1, a: 1, b: 2)" parses "foo(1, a: 1, b: 2)" parses ":\"foo\"" parses ":\"foo\"" parses "a = 1; a &*= 1" parses "a = 1; a &*= 1" 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 "[] of Int" parses "[] of Int" parses "*a = 1" parses "*a = 1" parses "a = uninitialized Foo; a" parses "a = uninitialized Foo; a" parses "protected def foo; end" parses "protected def foo; end" parses "foo &.[0] = 1" parses "foo &.[0] = 1" says syntax error on "module Foo; require \"bar\"; end" says syntax error on "module Foo; require \"bar\"; end" parses "1 / 2" parses "1 / 2" parses "foo.+(1, 2) { 3 }" parses "foo.+(1, 2) { 3 }" parses "a : Foo()*" parses "a : Foo()*" parses "foo *bar" parses "foo *bar" says syntax error on "lib Foo; union Bar{1}" says syntax error on "lib Foo; union Bar{1}" parses "def foo(x @@while); end" parses "def foo(x @@while); end" parses "{1 => 2, 3 => 4}" parses "{1 => 2, 3 => 4}" parses "Foo?" parses "Foo?" parses "foo a: b(1) do\nend" parses "foo a: b(1) do\nend" parses "def self.**(); end;" parses "def self.**(); end;" parses "foo(a: n &- 2)" parses "foo(a: n &- 2)" parses "1 ? 2 : 3" parses "1 ? 2 : 3" parses "foo(0, n == 2)" parses "foo(0, n == 2)" parses "%w{one\ntwo}" parses "%w{one\ntwo}" says syntax error on "Foo({x: X, x: Y})" says syntax error on "Foo({x: X, x: Y})" says syntax error on "lib Foo; enum Bar {|a|a}" says syntax error on "lib Foo; enum Bar {|a|a}" parses "def foo(x @end); end" parses "def foo(x @end); end" says syntax error on "foo &.[]? = 1" says syntax error on "foo &.[]? = 1" parses "annotation Foo; end" parses "annotation Foo; end" parses "n ^ 2" parses "n ^ 2" says syntax error on "def foo?=(x); end" says syntax error on "def foo?=(x); end" parses "def foo(while foo); end" parses "def foo(while foo); end" says syntax error on "break &** 1" says syntax error on "break &** 1" parses "def foo(@@extend); end" parses "def foo(@@extend); end" parses "{% x if 1 %}" parses "{% x if 1 %}" says syntax error on "foo { |(module)| }" says syntax error on "foo { |(module)| }" parses "def self.&; end;" parses "def self.&; end;" parses "foo &.+(2)" parses "foo &.+(2)" parses "->foo" parses "->foo" says syntax error on "macro Foo.bar;end" says syntax error on "macro Foo.bar;end" parses "1 -2_i64" parses "1 -2_i64" parses "1 \\\n + 2" parses "1 \\\n + 2" says syntax error on "def foo(\"\" y); y; end" says syntax error on "def foo(\"\" y); y; end" says syntax error on "break == 1" says syntax error on "break == 1" parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "<<-HERE\n \#{1} \#{2}\n HERE" parses "@a : Foo" parses "@a : Foo" parses "true : Int32" parses "true : Int32" says syntax error on "break &+ 1" says syntax error on "break &+ 1" says syntax error on "return === 1" says syntax error on "return === 1" parses "return 1, *2" parses "return 1, *2" parses "foo = 1; ->foo.[](Int32)" parses "foo = 1; ->foo.[](Int32)" says syntax error on "foo { |true| }" says syntax error on "foo { |true| }" parses "foo &.@bar[baz]" parses "foo &.@bar[baz]" says syntax error on "->(x y) { }" says syntax error on "->(x y) { }" 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 "next *{1, 2}" parses "next *{1, 2}" says syntax error on "enum Foo->{}" says syntax error on "enum Foo->{}" parses "def |(); end" parses "def |(); end" parses "foo.!~ 1, 2" parses "foo.!~ 1, 2" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1), \"c\"(2))" says syntax error on "def foo(foo in); end" says syntax error on "def foo(foo in); end" says syntax error on "lib Foo%x()" says syntax error on "lib Foo%x()" sets correct location and end location of parenthesized empty block sets correct location and end location of parenthesized empty block parses "def self./; end;" parses "def self./; end;" parses "def foo(@@sizeof); end" parses "def foo(@@sizeof); end" parses "a.b/2" parses "a.b/2" parses "def foo(n); foo(n -1); end" parses "def foo(n); foo(n -1); end" parses "def foo(x @@include); end" parses "def foo(x @@include); end" parses "def self.!=(); end;" parses "def self.!=(); end;" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "next *1" parses "next *1" `&&` and `||` are not methods says syntax error on "foo &.||" says syntax error on "foo &.||" says syntax error on "foo.||" says syntax error on "foo.||" says syntax error on "foo &.&&" says syntax error on "foo &.&&" says syntax error on "foo.||()" says syntax error on "foo.||()" says syntax error on "foo &.&&()" says syntax error on "foo &.&&()" says syntax error on "foo.&&" says syntax error on "foo.&&" says syntax error on "foo.&&()" says syntax error on "foo.&&()" says syntax error on "foo &.||()" says syntax error on "foo &.||()" parses "{\"foo\": 1, \"bar\": 2}" parses "{\"foo\": 1, \"bar\": 2}" parses "case {1}\nin {true}; 2; end" parses "case {1}\nin {true}; 2; end" parses "macro : Int32" parses "macro : Int32" parses "extend self" parses "extend self" says syntax error on "def foo x y; end" says syntax error on "def foo x y; end" says syntax error on "(1, 2 3)" says syntax error on "(1, 2 3)" parses "def foo(@@with); end" parses "def foo(@@with); end" parses "Int[8, 4]" parses "Int[8, 4]" parses "foo.>= 1, 2" parses "foo.>= 1, 2" parses "1.!(\n)" parses "1.!(\n)" says syntax error on "next + 1" says syntax error on "next + 1" says syntax error on "%i{one}}" says syntax error on "%i{one}}" parses "1 == 2" parses "1 == 2" says syntax error on "x++" says syntax error on "x++" says syntax error on "next[0]" says syntax error on "next[0]" parses "foo(1, **bar, &block)" parses "foo(1, **bar, &block)" parses "1 &+ 2" parses "1 &+ 2" says syntax error on "def foo(include); end" says syntax error on "def foo(include); end" parses "begin; 1; 2; 3; end;" parses "begin; 1; 2; 3; end;" says syntax error on "lib Foo; struct Bar {|a|a}" says syntax error on "lib Foo; struct Bar {|a|a}" says syntax error on "while return; end" says syntax error on "while return; end" parses "x = 1; foo.bar x do\nend" parses "x = 1; foo.bar x do\nend" parses "Foo?" parses "Foo?" parses "foo = 1; ->foo.&-(Int32)" parses "foo = 1; ->foo.&-(Int32)" parses "foo.<=(1, 2)" parses "foo.<=(1, 2)" says syntax error on "def foo(next); end" says syntax error on "def foo(next); end" parses "a = 1; a &+=\n1" parses "a = 1; a &+=\n1" parses "def self.<=(); end;" parses "def self.<=(); end;" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "macro foo\n <<-FOO, <<-BAR + \"\"\n FOO\n BAR\nend" parses "def ===(); end;" parses "def ===(); end;" parses ":^" parses ":^" parses "property lib : Int32" parses "property lib : Int32" says syntax error on "*a, b, c, d = 1, 2" says syntax error on "*a, b, c, d = 1, 2" gets corrects end location for block with { ... } gets corrects end location for block with { ... } says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" says syntax error on "{% unless 1 %} 2 {% elsif 3 %} 3 {% end %}" parses "x[a: 1, b: 2,]" parses "x[a: 1, b: 2,]" says syntax error on "next < 1" says syntax error on "next < 1" parses "foo\n #comment\n .bar" parses "foo\n #comment\n .bar" parses "case {1}\nin {Int32.class}; 2; end" parses "case {1}\nin {Int32.class}; 2; end" says syntax error on "Foo(T, U V)" says syntax error on "Foo(T, U V)" parses "enum Foo : UInt16 ; end" parses "enum Foo : UInt16 ; end" parses "module Foo(T); end" parses "module Foo(T); end" parses "def =~(); end" parses "def =~(); end" says syntax error on "1 == 2, a = 4" says syntax error on "1 == 2, a = 4" says syntax error on "foo { |(in)| }" says syntax error on "foo { |(in)| }" 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 "a.b -=\n1" parses "a.b -=\n1" says syntax error on "return - 1" says syntax error on "return - 1" parses "break 1, *2" parses "break 1, *2" says syntax error on "x, self = 1, 2" says syntax error on "x, self = 1, 2" parses "a : Foo" parses "a : Foo" parses "foo &.nil?" parses "foo &.nil?" parses "1 ensure 2" parses "1 ensure 2" parses "return 1, 2" parses "return 1, 2" parses "->Foo.&**(Int32)" parses "->Foo.&**(Int32)" parses "->foo!" parses "->foo!" parses "def foo(&); end" parses "def foo(&); end" says syntax error on "a.[]() += 1" says syntax error on "a.[]() += 1" says syntax error on "module Foo{1}" says syntax error on "module Foo{1}" says syntax error on "def foo @var, █ end" says syntax error on "def foo @var, █ end" says syntax error on "class Foo%x()" says syntax error on "class Foo%x()" parses "-1" parses "-1" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "macro foo; 1 + 2 {{foo}} 3 + 4; end" parses "foo[*baz] = 1" parses "foo[*baz] = 1" says syntax error on "{a[0]: 1}" says syntax error on "{a[0]: 1}" multiple parameters and blocks for operators ending in `=` parses "def <=(other, file = 1); end" parses "def <=(other, file = 1); end" parses "def ===(*args, **opts, &); end" parses "def ===(*args, **opts, &); end" parses "def >=(*args, **opts); end" parses "def >=(*args, **opts); end" parses "def ==(other, file = 1); end" parses "def ==(other, file = 1); end" parses "def >=(*args, **opts, &); end" parses "def >=(*args, **opts, &); end" parses "def !=(*args, **opts, &); end" parses "def !=(*args, **opts, &); end" parses "def >=(other, file = 1); end" parses "def >=(other, file = 1); end" parses "def ==(*args, **opts, &); end" parses "def ==(*args, **opts, &); end" parses "def []=(*args, **opts, &); end" parses "def []=(*args, **opts, &); end" parses "def !=(other, file = 1); end" parses "def !=(other, file = 1); end" parses "def !=(*args, **opts); end" parses "def !=(*args, **opts); end" parses "def ==(*args, **opts); end" parses "def ==(*args, **opts); end" parses "def <=(*args, **opts, &); end" parses "def <=(*args, **opts, &); end" parses "def []=(other, file = 1); end" parses "def []=(other, file = 1); end" parses "def ===(other, file = 1); end" parses "def ===(other, file = 1); end" parses "def []=(*args, **opts); end" parses "def []=(*args, **opts); end" parses "def <=(*args, **opts); end" parses "def <=(*args, **opts); end" parses "def ===(*args, **opts); end" parses "def ===(*args, **opts); end" parses "foo = 1; ->foo.>>(Int32)" parses "foo = 1; ->foo.>>(Int32)" says syntax error on "return == 1" says syntax error on "return == 1" parses "->Foo.>=(Int32)" parses "->Foo.>=(Int32)" parses "def foo(x @@self); end" parses "def foo(x @@self); end" parses "module : Int32" parses "module : Int32" says syntax error on "def foo(foo enum); end" says syntax error on "def foo(foo enum); end" says syntax error on "next > 1" says syntax error on "next > 1" parses "def foo\n1\nend\nif 1\nend" parses "def foo\n1\nend\nif 1\nend" parses "n &** 2" parses "n &** 2" parses "def foo(x @while); end" parses "def foo(x @while); end" parses "def foo; a; end" parses "def foo; a; end" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "asm(\"nop\" : \"a\"(0) : \"b\"(1))" parses "*a = 1, 2" parses "*a = 1, 2" parses "foo &./(1)" parses "foo &./(1)" parses "foo.| 1, 2" parses "foo.| 1, 2" says syntax error on "\"\#{<<-HERE}\"\nHERE" says syntax error on "\"\#{<<-HERE}\"\nHERE" parses "def foo(@[Foo] **args); end" parses "def foo(@[Foo] **args); end" says syntax error on "1 while 3" says syntax error on "1 while 3" parses "def foo(x = 1, *y); 1; end" parses "def foo(x = 1, *y); 1; end" parses "Foo::Bar" parses "Foo::Bar" says syntax error on "foo[return]" says syntax error on "foo[return]" says syntax error on "lib Foo%end" says syntax error on "lib Foo%end" parses "->::Foo.foo?" parses "->::Foo.foo?" parses "fun : Int32" parses "fun : Int32" parses "enum Foo; private def foo; 1; end; end" parses "enum Foo; private def foo; 1; end; end" parses "foo.=== 1, 2" parses "foo.=== 1, 2" parses "1.0" parses "1.0" parses "struct Foo %() end" parses "struct Foo %() end" parses ":&" parses ":&" 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" says syntax error on "macro foo&&;end" says syntax error on "macro foo&&;end" says syntax error on "+break" says syntax error on "+break" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "{\n1 => 2, 3 => 4\n5 => 6}" says syntax error on "break // 1" says syntax error on "break // 1" says syntax error on "foo { |typeof| }" says syntax error on "foo { |typeof| }" parses "def foo(x @@asm); end" parses "def foo(x @@asm); end" parses "a.foo(&block)" parses "a.foo(&block)" parses "lib LibC; type A = B; end" parses "lib LibC; type A = B; end" parses "a.b ^=\n1" parses "a.b ^=\n1" says syntax error on "next % 1" says syntax error on "next % 1" says syntax error on "enum Foo\"a\"" says syntax error on "enum Foo\"a\"" parses "foo(a: n & 2)" parses "foo(a: n & 2)" says syntax error on "a() = 1" says syntax error on "a() = 1" parses "foo.<=" parses "foo.<=" parses "n % 2" parses "n % 2" parses "foo(x, *bar, *baz, y)" parses "foo(x, *bar, *baz, y)" parses "foo[0] = 1" parses "foo[0] = 1" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "asm(\"nop\" : \"a\"(0), \"b\"(1) : \"c\"(2), \"d\"(3))" parses "->Foo.%(Int32)" parses "->Foo.%(Int32)" parses "def foo; a = 1; a {}; end" parses "def foo; a = 1; a {}; end" says syntax error on "foo(1, 2, 3 end" says syntax error on "foo(1, 2, 3 end" parses "def foo(@[Foo] &@block); end" parses "def foo(@[Foo] &@block); end" says syntax error on " [1, 2, 3 end" says syntax error on " [1, 2, 3 end" parses "x[0] ? 1 : 0" parses "x[0] ? 1 : 0" parses "def foo(x @@enum); end" parses "def foo(x @@enum); end" parses "def foo(@@return); end" parses "def foo(@@return); end" says syntax error on "foo &.bar.[] 0 = 1" says syntax error on "foo &.bar.[] 0 = 1" parses "def self.%(); end;" parses "def self.%(); end;" parses "foo.bar [1]" parses "foo.bar [1]" says syntax error on "foo { |(lib)| }" says syntax error on "foo { |(lib)| }" parses "def self.~; end;" parses "def self.~; end;" parses "alignof(\n Int32\n)" parses "alignof(\n Int32\n)" says syntax error on "b? = 1" says syntax error on "b? = 1" parses "foo &block" parses "foo &block" parses "\"hello \\\n world\"" parses "\"hello \\\n world\"" parses "{{ foo.nil?(foo) }}" parses "{{ foo.nil?(foo) }}" parses "def foo(macro foo); end" parses "def foo(macro foo); end" parses "def foo(x @@extend); end" parses "def foo(x @@extend); end" parses "->() { }" parses "->() { }" parses "foo.^(1, 2) { 3 }" parses "foo.^(1, 2) { 3 }" parses "foo.&(1, 2)" parses "foo.&(1, 2)" parses "a.b /2/" parses "a.b /2/" parses "def foo(@@abstract); end" parses "def foo(@@abstract); end" parses ":<=" parses ":<=" parses "a = 1; a /=\n1" parses "a = 1; a /=\n1" parses "!1" parses "!1" says syntax error on "foo { |instance_sizeof| }" says syntax error on "foo { |instance_sizeof| }" parses "foo do |a|; 1; end" parses "foo do |a|; 1; end" says syntax error on "->::@foo.foo" says syntax error on "->::@foo.foo" parses "begin; / /; end" parses "begin; / /; end" parses "def -(); end" parses "def -(); end" parses "{% begin %}%Q| %s |{% end %}" parses "{% begin %}%Q| %s |{% end %}" says syntax error on "next[0]= 1" says syntax error on "next[0]= 1" parses "foo(\n1\n)" parses "foo(\n1\n)" says syntax error on "break[]" says syntax error on "break[]" parses "a.b &+=\n1" parses "a.b &+=\n1" parses "foo(a: n << 2)" parses "foo(a: n << 2)" parses "def foo(x : U) : Int32 forall T, U; end" parses "def foo(x : U) : Int32 forall T, U; end" parses "n >> 2" parses "n >> 2" parses "foo(0, n << 2)" parses "foo(0, n << 2)" parses "foo(0, n === 2)" parses "foo(0, n === 2)" sets correct location of parameter in proc literal sets correct location of parameter in proc literal parses "(1)\nif true; end" parses "(1)\nif true; end" parses "def foo(x @@end); end" parses "def foo(x @@end); end" parses "/foo/i" parses "/foo/i" parses "foo = 1; ->foo.!~(Int32)" parses "foo = 1; ->foo.!~(Int32)" parses "case 1\nin false; 2; end" parses "case 1\nin false; 2; end" says syntax error on "foo &.[]? 0 =(1)" says syntax error on "foo &.[]? 0 =(1)" suffix `if`/`unless` in macros after macro var parses "macro foo;var if true;end" parses "macro foo;var if true;end" parses "macro foo;unless %var;true;end;end" parses "macro foo;unless %var;true;end;end" parses "macro foo;unless var;true;end;end" parses "macro foo;unless var;true;end;end" parses "macro foo;%var if true;end" parses "macro foo;%var if true;end" parses "macro foo;var unless true;end" parses "macro foo;var unless true;end" parses "macro foo;if %var;true;end;end" parses "macro foo;if %var;true;end;end" parses "macro foo;%var unless true;end" parses "macro foo;%var unless true;end" parses "macro foo;if var;true;end;end" parses "macro foo;if var;true;end;end" parses "if (\ntrue\n)\n1\nend" parses "if (\ntrue\n)\n1\nend" parses "4./(2)" parses "4./(2)" says syntax error on "def foo(foo if); end" says syntax error on "def foo(foo if); end" parses "<<-HERE\n One\n\n Zero\n HERE" parses "<<-HERE\n One\n\n Zero\n HERE" parses "foo.>(1, 2)" parses "foo.>(1, 2)" parses "def foo(@@var); end" parses "def foo(@@var); end" says syntax error on "class Foo(T, T); end" says syntax error on "class Foo(T, T); end" parses "def foo; x { |a, *b| b }; end" parses "def foo; x { |a, *b| b }; end" says syntax error on "macro foo(*x, *y); end" says syntax error on "macro foo(*x, *y); end" parses "a = 1; yield a ensure a" parses "a = 1; yield a ensure a" parses "def foo; with a yield; end" parses "def foo; with a yield; end" gets corrects end location for var gets corrects end location for var parses "Foo(Bar())" parses "Foo(Bar())" says syntax error on "enum Foo : Int32%x()" says syntax error on "enum Foo : Int32%x()" parses "def foo(x @@break); end" parses "def foo(x @@break); end" says syntax error on "def foo(x @x); 1; end" says syntax error on "def foo(x @x); 1; end" says syntax error on "def Foo(Int32).bar;end" says syntax error on "def Foo(Int32).bar;end" parses "foo.^(1, 2)" parses "foo.^(1, 2)" parses "1\\\r\n + 2" parses "1\\\r\n + 2" says syntax error on "class Foo {|a|a}" says syntax error on "class Foo {|a|a}" says syntax error on "foo { |(false)| }" says syntax error on "foo { |(false)| }" parses "n <= 2" parses "n <= 2" parses "def foo(x @@private); end" parses "def foo(x @@private); end" says syntax error on "def foo(foo while); end" says syntax error on "def foo(foo while); end" says syntax error on "annotation Foo->{}" says syntax error on "annotation Foo->{}" says syntax error on "next * 1" says syntax error on "next * 1" parses "(bar {})" parses "(bar {})" parses "a[], a[] = 1, 2" parses "a[], a[] = 1, 2" parses "a; if / /; / /; elsif / /; / /; end" parses "a; if / /; / /; elsif / /; / /; end" parses "-1.0_f32" parses "-1.0_f32" says syntax error on "def foo(foo class); end" says syntax error on "def foo(foo class); end" parses "1 || 2" parses "1 || 2" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "<<-HERE\n \#{1} \\n \#{2}\n HERE" parses "var.@foo.@bar" parses "var.@foo.@bar" parses "x[a: 1, b: 2]" parses "x[a: 1, b: 2]" parses "a = / /" parses "a = / /" parses ":!" parses ":!" parses "select\nwhen foo\n2\nend" parses "select\nwhen foo\n2\nend" parses "%r(/)" parses "%r(/)" parses "begin; 1; rescue Foo | Bar; 2; end" parses "begin; 1; rescue Foo | Bar; 2; end" says syntax error on "lib Foo; enum Bar%x()" says syntax error on "lib Foo; enum Bar%x()" parses "1 < 2" parses "1 < 2" parses "def !~(); end;" parses "def !~(); end;" parses "def foo(instance_sizeof foo); end" parses "def foo(instance_sizeof foo); 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" says syntax error on "/foo)/" says syntax error on "/foo)/" parses "{A: 1, B: 2}" parses "{A: 1, B: 2}" says syntax error on "foo { |fun| }" says syntax error on "foo { |fun| }" parses "class Foo < Bar :Qux end" parses "class Foo < Bar :Qux end" parses "-> do end" parses "-> do end" parses "begin; rescue; end" parses "begin; rescue; end" parses "a = 1; a ^=\n1" parses "a = 1; a ^=\n1" parses "1 ? a : b" parses "1 ? a : b" parses "->Foo.&-(Int32)" parses "->Foo.&-(Int32)" parses "a : Foo | Int32" parses "a : Foo | Int32" parses "def foo(@offsetof); end" parses "def foo(@offsetof); end" parses "(1 ... )" parses "(1 ... )" parses "::Foo{\"x\" => \"y\"}" parses "::Foo{\"x\" => \"y\"}" parses "[/ /, / /]" parses "[/ /, / /]" parses "include : Int32" parses "include : Int32" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "macro foo; 1 + 2 {{ foo }} 3 + 4; end" parses "def foo(include foo); end" parses "def foo(include foo); end" parses "struct Foo ->(x : Bar){} end" parses "struct Foo ->(x : Bar){} end" parses "enum Foo; {{1}}; end" parses "enum Foo; {{1}}; end" says syntax error on "next.foo" says syntax error on "next.foo" parses "def foo(@out); end" parses "def foo(@out); end" parses "a = 1; a %= 1" parses "a = 1; a %= 1" parses "def !=; end;" parses "def !=; end;" global regex match data says syntax error on "$0 = 1" says syntax error on "$0 = 1" parses "$0" parses "$0" parses "$~ = 1" parses "$~ = 1" parses "$1?" parses "$1?" says syntax error on "$99999999999999999999999?" says syntax error on "$99999999999999999999999?" parses "foo $?" parses "foo $?" parses "$? = 1" parses "$? = 1" parses "$~" parses "$~" parses "$?.foo" parses "$?.foo" says syntax error on "$2147483648" says syntax error on "$2147483648" parses "foo $1" parses "foo $1" 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, a = {1, 2}" says syntax error on "$0, a = {1, 2}" parses "$?" parses "$?" parses "$1" parses "$1" parses "next : Int32" parses "next : Int32" parses "def foo(**args : Foo)\n1\nend" parses "def foo(**args : Foo)\n1\nend" parses "foo { |(a, (b, (c, d)))| }" parses "foo { |(a, (b, (c, d)))| }" parses "foo = 1; ->foo.<<(Int32)" parses "foo = 1; ->foo.<<(Int32)" parses "def foo(@@next); end" parses "def foo(@@next); end" parses "def foo; end; if false; 1; else; 2; end" parses "def foo; end; if false; 1; else; 2; end" says syntax error on "class Foo < Bar\"a\"" says syntax error on "class Foo < Bar\"a\"" parses "while : Int32" parses "while : Int32" parses "@@foo" parses "@@foo" says syntax error on "lib Foo:qux" says syntax error on "lib Foo:qux" says syntax error on "1 2" says syntax error on "1 2" says syntax error on "{\n\"foo\"\n\"bar\"\n}" says syntax error on "{\n\"foo\"\n\"bar\"\n}" parses "def foo(\nvar); end" parses "def foo(\nvar); end" says syntax error on "a = a" says syntax error on "a = a" parses "puts __DIR__" parses "puts __DIR__" parses "asm(\"nop\" ::::)" parses "asm(\"nop\" ::::)" says syntax error on "def foo(x : (*Int32)); end" says syntax error on "def foo(x : (*Int32)); end" parses "def ^; end;" parses "def ^; end;" parses "def foo(x @nil); end" parses "def foo(x @nil); end" parses "{% begin %}%r<\\A>{% end %}" parses "{% begin %}%r<\\A>{% end %}" parses "x = 1; foo x do\nend" parses "x = 1; foo x do\nend" parses "class Foo %() end" parses "class Foo %() end" parses "property return : Int32" parses "property return : Int32" parses "x[{1}]" parses "x[{1}]" parses "@[Foo()]" parses "@[Foo()]" parses "::T/1" parses "::T/1" parses "def +; end;" parses "def +; end;" parses "n &- 2" parses "n &- 2" parses "def foo(x = __LINE__); end" parses "def foo(x = __LINE__); end" parses "%r(\\ )" parses "%r(\\ )" parses "Foo()" parses "Foo()" parses "require \"foo\"; [1]" parses "require \"foo\"; [1]" parses "foo.===" parses "foo.===" sets correct locations of macro if / elsif sets correct locations of macro if / elsif parses "@foo" parses "@foo" says syntax error on "foo **bar, *x" says syntax error on "foo **bar, *x" says syntax error on "next | 1" says syntax error on "next | 1" says syntax error on "def foo(**x, &x); end" says syntax error on "def foo(**x, &x); end" says syntax error on "return do\nend" says syntax error on "return do\nend" sets correct location of element in array literal sets correct location of element in array literal parses "property false : Int32" parses "property false : Int32" parses "foo &.[]" parses "foo &.[]" parses "foo.!=" parses "foo.!=" parses "def foo(@in); end" parses "def foo(@in); end" parses "def self.&(); end;" parses "def self.&(); end;" parses "foo.==(1, 2) { 3 }" parses "foo.==(1, 2) { 3 }" parses "def foo(x @@sizeof); end" parses "def foo(x @@sizeof); end" sets correct location of private method in enum sets correct location of private method in enum parses "{% begin %}%{ %s }{% end %}" parses "{% begin %}%{ %s }{% end %}" parses "f.x Foo.new" parses "f.x Foo.new" parses "foo(z: 0, a: n &- 2)" parses "foo(z: 0, a: n &- 2)" parses "x = 1; ->{ x }" parses "x = 1; ->{ x }" parses "a = 1; a &&= 1" parses "a = 1; a &&= 1" parses "begin; 1; rescue ex; 2; end" parses "begin; 1; rescue ex; 2; end" parses "ensure : Int32" parses "ensure : Int32" parses "def foo(@yield); end" parses "def foo(@yield); end" parses "()" parses "()" parses "{} of Int => Double" parses "{} of Int => Double" parses "1_i128" parses "1_i128" parses "a = 1; a[2] ||= 3" parses "a = 1; a[2] ||= 3" parses "/fo\\so/" parses "/fo\\so/" says syntax error on "%w(" says syntax error on "%w(" parses "def foo(x @@unless); end" parses "def foo(x @@unless); end" parses "foo(n == 2)" parses "foo(n == 2)" says syntax error on "1 .. next" says syntax error on "1 .. next" parses ":>" parses ":>" parses "->Foo.[](Int32)" parses "->Foo.[](Int32)" parses "lib LibC; fun foo : Int**; end" parses "lib LibC; fun foo : Int**; end" parses "a = 1; a |=\n1" parses "a = 1; a |=\n1" parses "foo(a: 1\n)" parses "foo(a: 1\n)" says syntax error on "def foo(x :Int32); end" says syntax error on "def foo(x :Int32); end" says syntax error on "lib Foo; enum Bar:Qux" says syntax error on "lib Foo; enum Bar:Qux" parses "1.0_f32" parses "1.0_f32" parses "foo.===(1, 2)" parses "foo.===(1, 2)" parses "~ 1" parses "~ 1" parses "foo.nil?( )" parses "foo.nil?( )" parses "a = 1; a &=\n1" parses "a = 1; a &=\n1" says syntax error on "def foo(foo return); end" says syntax error on "def foo(foo return); end" parses "{% for _, x, _ in y %}body{% end %}" parses "{% for _, x, _ in y %}body{% end %}" parses "class Foo :bar end" parses "class Foo :bar end" parses "macro foo(@[Foo] **args);end" parses "macro foo(@[Foo] **args);end" parses "->@foo.foo?" parses "->@foo.foo?" parses "def foo(@return); end" parses "def foo(@return); end" says syntax error on "A = (B = 1)" says syntax error on "A = (B = 1)" parses "{% begin %}%i( %s ){% end %}" parses "{% begin %}%i( %s ){% end %}" says syntax error on "class Foo{|a|a}" says syntax error on "class Foo{|a|a}" parses "case 1; end" parses "case 1; end" parses "asm(\"nop\" ::)" parses "asm(\"nop\" ::)" parses "foo = 1; ->foo.<(Int32)" parses "foo = 1; ->foo.<(Int32)" parses "def foo(@@instance_sizeof); end" parses "def foo(@@instance_sizeof); end" parses "Foo(\n)" parses "Foo(\n)" parses "property case : Int32" parses "property case : Int32" parses "case {1}\nin {Int32}; 2; end" parses "case {1}\nin {Int32}; 2; end" parses "foo { |(_, c, )| c }" parses "foo { |(_, c, )| c }" end locations gets corrects end location for "Foo(A)" gets corrects end location for "Foo(A)" gets corrects end location for "1..3" gets corrects end location for "1..3" gets corrects end location for "Foo?" gets corrects end location for "Foo?" gets corrects end location for "foo.nil?" gets corrects end location for "foo.nil?" gets corrects end location for "@@foo" gets corrects end location for "@@foo" gets corrects end location for "Foo { 1 }" gets corrects end location for "Foo { 1 }" gets corrects end location for "@foo" gets corrects end location for "@foo" gets corrects end location for "foo 1, 2" gets corrects end location for "foo 1, 2" gets corrects end location for "asm(\"nop\" ::)" gets corrects end location for "asm(\"nop\" ::)" gets corrects end location for "a && b" gets corrects end location for "a && b" gets corrects end location for "foo.[0] = 1" gets corrects end location for "foo.[0] = 1" gets corrects end location for "Foo" gets corrects end location for "Foo" gets corrects end location for "1 if 2" gets corrects end location for "1 if 2" 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 "123" gets corrects end location for "123" gets corrects end location for "f.x=(foo).bar" gets corrects end location for "f.x=(foo).bar" gets corrects end location for "def foo; 1; end" gets corrects end location for "def foo; 1; end" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "offsetof(Foo, @a)" gets corrects end location for "return" gets corrects end location for "return" gets corrects end location for "a, b = 1, 2 if 3" gets corrects end location for "a, b = 1, 2 if 3" gets corrects end location for "foo.!()" gets corrects end location for "foo.!()" gets corrects end location for "struct Foo; end" gets corrects end location for "struct Foo; end" gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "x : Foo(A, *B, C)" gets corrects end location for "foo : Foo?" gets corrects end location for "foo : Foo?" gets corrects end location for "macro foo;end" gets corrects end location for "macro foo;end" gets corrects end location for "foo *bar" gets corrects end location for "foo *bar" gets corrects end location for "return 1" gets corrects end location for "return 1" gets corrects end location for "[] of Int32" gets corrects end location for "[] of Int32" gets corrects end location for "foo &bar" gets corrects end location for "foo &bar" gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "foo.bar(x) do; end" gets corrects end location for "/foo/" gets corrects end location for "/foo/" gets corrects end location for "pointerof(@foo)" gets corrects end location for "pointerof(@foo)" gets corrects end location for "123.45" gets corrects end location for "123.45" gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "offsetof({X, Y}, 1)" gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "foo ->@@bar.baz" gets corrects end location for "unless 1; 2; end" gets corrects end location for "unless 1; 2; end" gets corrects end location for "1 rescue 2" gets corrects end location for "1 rescue 2" gets corrects end location for "{} of Int32 => String" gets corrects end location for "{} of Int32 => String" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "foo(\n &.block\n)" gets corrects end location for "def foo; end" gets corrects end location for "def foo; end" gets corrects end location for "foo.!" gets corrects end location for "foo.!" gets corrects end location for "foo **bar" gets corrects end location for "foo **bar" gets corrects end location for "if 1; else; 2; end" gets corrects end location for "if 1; else; 2; end" gets corrects end location for "foo &.bar" gets corrects end location for "foo &.bar" gets corrects end location for "abstract def foo(x)" gets corrects end location for "abstract def foo(x)" gets corrects end location for "sizeof(Foo)" gets corrects end location for "sizeof(Foo)" gets corrects end location for "1.." gets corrects end location for "1.." gets corrects end location for "!foo" gets corrects end location for "!foo" gets corrects end location for "foo(1, 2)" gets corrects end location for "foo(1, 2)" gets corrects end location for "foo ->@bar.baz=" gets corrects end location for "foo ->@bar.baz=" 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 = 123" gets corrects end location for "a = 123" gets corrects end location for "foo : Foo**" gets corrects end location for "foo : Foo**" gets corrects end location for "alias Foo = Bar" gets corrects end location for "alias Foo = Bar" gets corrects end location for "Int[8]?" gets corrects end location for "Int[8]?" gets corrects end location for "if 1; elseif; 2; end" gets corrects end location for "if 1; elseif; 2; end" gets corrects end location for "1 ensure 2" gets corrects end location for "1 ensure 2" gets corrects end location for "f.x=(*foo)" gets corrects end location for "f.x=(*foo)" gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "foo.responds_to? :foo" gets corrects end location for "typeof(1)" gets corrects end location for "typeof(1)" gets corrects end location for "yield" gets corrects end location for "yield" gets corrects end location for "->{ }" gets corrects end location for "->{ }" gets corrects end location for "x : Foo -> Bar" gets corrects end location for "x : Foo -> Bar" gets corrects end location for "foo.nil?( )" gets corrects end location for "foo.nil?( )" gets corrects end location for "foo ->self.bar" gets corrects end location for "foo ->self.bar" gets corrects end location for "foo.@foo" gets corrects end location for "foo.@foo" gets corrects end location for "foo ->Bar.baz" gets corrects end location for "foo ->Bar.baz" gets corrects end location for "begin; 1; end" gets corrects end location for "begin; 1; end" gets corrects end location for "foo : Foo*" gets corrects end location for "foo : Foo*" gets corrects end location for "foo" gets corrects end location for "foo" gets corrects end location for "foo : Foo[42]" gets corrects end location for "foo : Foo[42]" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "foo ->Bar.baz=" gets corrects end location for "foo ->self.bar=" gets corrects end location for "foo ->self.bar=" gets corrects end location for "abstract def foo" gets corrects end location for "abstract def foo" gets corrects end location for "[1, 2,]" gets corrects end location for "[1, 2,]" gets corrects end location for "foo ->@bar.baz" gets corrects end location for "foo ->@bar.baz" gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "@@a = uninitialized Foo" gets corrects end location for "extend Foo" gets corrects end location for "extend Foo" gets corrects end location for "foo ->bar(Baz)" gets corrects end location for "foo ->bar(Baz)" gets corrects end location for "puts obj.foo" gets corrects end location for "puts obj.foo" gets corrects end location for "{1, 2}" gets corrects end location for "{1, 2}" gets corrects end location for "x : Foo ->" gets corrects end location for "x : Foo ->" gets corrects end location for "case :foo; when :bar; 2; end" gets corrects end location for "case :foo; when :bar; 2; end" gets corrects end location for "::foo" gets corrects end location for "::foo" gets corrects end location for "[1, 2]" gets corrects end location for "[1, 2]" gets corrects end location for "nil" gets corrects end location for "nil" gets corrects end location for "include Foo" gets corrects end location for "include Foo" gets corrects end location for "module Foo; end" gets corrects end location for "module Foo; end" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "@a = uninitialized Foo" gets corrects end location for "1.as(Int32)" gets corrects end location for "1.as(Int32)" gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for "begin; 1; 2; 3; end" gets corrects end location for "{a: 1}" gets corrects end location for "{a: 1}" gets corrects end location for "foo ->bar" gets corrects end location for "foo ->bar" gets corrects end location for "\"hello\"" gets corrects end location for "\"hello\"" gets corrects end location for "foo : Foo.class" gets corrects end location for "foo : Foo.class" gets corrects end location for "class Foo; end" gets corrects end location for "class Foo; end" gets corrects end location for "macro foo; 123; end" gets corrects end location for "macro foo; 123; end" gets corrects end location for "foo(&bar)" gets corrects end location for "foo(&bar)" gets corrects end location for "\"hello \"\\\n\"world\"" gets corrects end location for "\"hello \"\\\n\"world\"" gets corrects end location for "%w(one two)" gets corrects end location for "%w(one two)" gets corrects end location for "'a'" gets corrects end location for "'a'" gets corrects end location for "foo(&.bar)" gets corrects end location for "foo(&.bar)" gets corrects end location for "a, b = 1, 2" gets corrects end location for "a, b = 1, 2" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "foo ->@@bar.baz=" gets corrects end location for "f.x = foo" gets corrects end location for "f.x = foo" gets corrects end location for "while 1; end" gets corrects end location for "while 1; end" gets corrects end location for "require \"foo\"" gets corrects end location for "require \"foo\"" gets corrects end location for "yield 1" gets corrects end location for "yield 1" gets corrects end location for ":foo" gets corrects end location for ":foo" gets corrects end location for "foo bar, out baz" gets corrects end location for "foo bar, out baz" gets corrects end location for "a || b" gets corrects end location for "a || b" gets corrects end location for "false" gets corrects end location for "false" gets corrects end location for "foo ->bar=" gets corrects end location for "foo ->bar=" gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "foo.responds_to?(:foo)" gets corrects end location for "foo.bar= *baz" gets corrects end location for "foo.bar= *baz" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "abstract def foo : Int32" gets corrects end location for "select; when foo; 2; end" gets corrects end location for "select; when foo; 2; end" says syntax error on "case next; when 1; end; end" says syntax error on "case next; when 1; end; end" says syntax error on "def foo(x x); 1; end" says syntax error on "def foo(x x); 1; end" says syntax error on "def foo(x : Int32, Int32); end" says syntax error on "def foo(x : Int32, Int32); end" parses "begin; 1; ensure; 2; end" parses "begin; 1; ensure; 2; end" parses "Foo(\"foo bar\": U)" parses "Foo(\"foo bar\": U)" parses "enum Foo; @[Bar]; end" parses "enum Foo; @[Bar]; end" parses "def =~(); end;" parses "def =~(); end;" parses "foo(\n &.block\n)" parses "foo(\n &.block\n)" parses "foo &.block=(0)" parses "foo &.block=(0)" sets correct locations of keywords of exception handler sets correct locations of keywords of exception handler says syntax error on "%q(" says syntax error on "%q(" parses "foo.=~" parses "foo.=~" says syntax error on "module Foo%x()" says syntax error on "module Foo%x()" parses "def foo(in foo); end" parses "def foo(in foo); end" parses "next" parses "next" says syntax error on "pointerof(self)" says syntax error on "pointerof(self)" says syntax error on "case x; when true; 2; when true; end" says syntax error on "case x; when true; 2; when true; end" says syntax error on "class Foo < Bar:Qux" says syntax error on "class Foo < Bar:Qux" parses "lib LibC\nfun getchar(a : Int)\nend" parses "lib LibC\nfun getchar(a : Int)\nend" says syntax error on "class Foo->{}" says syntax error on "class Foo->{}" sets args_in_brackets to true for `a[b]` sets args_in_brackets to true for `a[b]` says syntax error on "a, B = 1, 2" says syntax error on "a, B = 1, 2" says syntax error on "1 foo" says syntax error on "1 foo" parses "def foo(x @@in); end" parses "def foo(x @@in); end" says syntax error on "*a, b, c, d, e = 1, 2" says syntax error on "*a, b, c, d, e = 1, 2" 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)" says syntax error on "@@foo :: Foo" says syntax error on "@@foo :: Foo" says syntax error on "foo { |next| }" says syntax error on "foo { |next| }" parses "abstract def foo\n1" parses "abstract def foo\n1" says syntax error on "lib Foo; struct Bar%w()" says syntax error on "lib Foo; struct Bar%w()" parses "macro foo(x = __LINE__);end" parses "macro foo(x = __LINE__);end" says syntax error on "\"foo\" \"bar\"" says syntax error on "\"foo\" \"bar\"" gets corrects end location for block with do ... end gets corrects end location for block with do ... end parses "def foo(x @next); end" parses "def foo(x @next); end" parses "{%\n2 if 1; 3\n%}" parses "{%\n2 if 1; 3\n%}" parses "1 ... 2" parses "1 ... 2" says syntax error on "foo { |end| }" says syntax error on "foo { |end| }" says syntax error on "foo { |a b| }" says syntax error on "foo { |a b| }" parses "a = 1; a += 1" parses "a = 1; a += 1" parses "foo +1.0" parses "foo +1.0" parses ":>>" parses ":>>" parses "1;+2" parses "1;+2" says syntax error on "FOO, BAR = 1, 2" says syntax error on "FOO, BAR = 1, 2" parses "foo(n & 2)" parses "foo(n & 2)" says syntax error on "case x; when 1..2; 2; when 1..2; end" says syntax error on "case x; when 1..2; 2; when 1..2; end" parses "def self./(); end;" parses "def self./(); end;" parses "Foo()?" parses "Foo()?" says syntax error on "def foo(foo require); end" says syntax error on "def foo(foo require); end" says syntax error on "class Foo->(x : Qux){}" says syntax error on "class Foo->(x : Qux){}" parses "def foo(x = __DIR__); end" parses "def foo(x = __DIR__); end" parses "def foo(@nil); end" parses "def foo(@nil); end" parses "x = 1 rescue 2" parses "x = 1 rescue 2" parses "foo.>(1, 2) { 3 }" parses "foo.>(1, 2) { 3 }" says syntax warning on "macro foo(foo bar!); end" says syntax warning on "macro foo(foo bar!); end" parses "def foo(x @typeof); end" parses "def foo(x @typeof); end" parses "next 1" parses "next 1" says syntax error on "module Foo:Qux" says syntax error on "module Foo:Qux" parses "{% begin %}%Q{ %s }{% end %}" parses "{% begin %}%Q{ %s }{% end %}" parses "case {1}\nin {nil}; 2; end" parses "case {1}\nin {nil}; 2; end" parses "def foo(&block : Int ->\n); end" parses "def foo(&block : Int ->\n); end" parses "a = 1; a ||= 1" parses "a = 1; a ||= 1" says syntax error on "foo[0]? += 1" says syntax error on "foo[0]? += 1" parses "def foo; with a yield 1; end" parses "def foo; with a yield 1; end" parses "foo.<(1, 2)" parses "foo.<(1, 2)" parses "foo(0, n // 2)" parses "foo(0, n // 2)" says syntax error on "*a, 1 = 2" says syntax error on "*a, 1 = 2" says syntax error on "self += 1" says syntax error on "self += 1" says syntax error on "def foo(select); end" says syntax error on "def foo(select); end" says syntax error on "foo(**bar, 1)" says syntax error on "foo(**bar, 1)" parses "case;end" parses "case;end" parses "2 * (3 + 4)" parses "2 * (3 + 4)" parses "foo.is_a?(Const)" parses "foo.is_a?(Const)" parses "def foo(@alias); end" parses "def foo(@alias); end" parses "1\n+2" parses "1\n+2" says syntax error on "lib Foo; struct Bar->{}" says syntax error on "lib Foo; struct Bar->{}" parses "/foo/m" parses "/foo/m" parses "def foo(var : Int32 = 1); end" parses "def foo(var : Int32 = 1); end" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "a ?\n b ? b1 : b2\n : c ? 3\n : 0" parses "->Foo.**(Int32)" parses "->Foo.**(Int32)" says syntax error on "def foo(foo extend); end" says syntax error on "def foo(foo extend); end" parses "n - 2" parses "n - 2" parses "case 1\nwhen .foo\n2\nend" parses "case 1\nwhen .foo\n2\nend" parses "1 >> 2" parses "1 >> 2" parses "def foo(@asm); end" parses "def foo(@asm); end" parses "module Foo :Bar end" parses "module Foo :Bar end" says syntax error on "a.b() += 1" says syntax error on "a.b() += 1" says syntax error on "a() += 1" says syntax error on "a() += 1" parses "def foo; a = 1; x { a }; end" parses "def foo; a = 1; x { a }; end" says syntax error on "struct Foo{1}" says syntax error on "struct Foo{1}" parses "def foo(@@until); end" parses "def foo(@@until); end" parses "def foo(until foo); end" parses "def foo(until foo); end" 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 "{{ 1 // 2 }}" parses "{{ 1 // 2 }}" says syntax error on "def foo(pointerof); end" says syntax error on "def foo(pointerof); end" parses "def foo;{{@type}};end" parses "def foo;{{@type}};end" parses "{[] of Foo, Bar::Baz.new}" parses "{[] of Foo, Bar::Baz.new}" says syntax error on "foo(break)" says syntax error on "foo(break)" parses "break;" parses "break;" parses "def foo(self foo); end" parses "def foo(self foo); end" parses "def foo;bar(end: 1);end" parses "def foo;bar(end: 1);end" parses "foo = 1; ->foo.==(Int32)" parses "foo = 1; ->foo.==(Int32)" parses "->Foo.^(Int32)" parses "->Foo.^(Int32)" parses "struct Foo 'a' end" parses "struct Foo 'a' end" parses "property require : Int32" parses "property require : Int32" parses "struct : Int32" parses "struct : Int32" parses "a = 1; a //=\n1" parses "a = 1; a //=\n1" parses "elsif : Int32" parses "elsif : Int32" parses "foo = 1; ->foo.^(Int32)" parses "foo = 1; ->foo.^(Int32)" says syntax error on "module Foo:qux" says syntax error on "module Foo:qux" parses "{% begin %}{% if true %}if true{% end %}\n{% if true %}end{% end %}{% end %}" parses "{% begin %}{% if true %}if true{% end %}\n{% if true %}end{% end %}{% end %}" says syntax error on "[1\n,2]" says syntax error on "[1\n,2]" parses "begin\n/ /\nend" parses "begin\n/ /\nend" says syntax error on "Set {1, 2, 3} of Int32" says syntax error on "Set {1, 2, 3} of Int32" parses "%i{(one two)}" parses "%i{(one two)}" parses "Foo(T)?" parses "Foo(T)?" 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 "1\\\n + 2" parses "1\\\n + 2" parses "instance_sizeof(\n Int32\n)" parses "instance_sizeof(\n Int32\n)" says syntax error on "lib Foo->(x : Qux){}" says syntax error on "lib Foo->(x : Qux){}" 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 "macro foo(x, *); 1; end" says syntax error on "macro foo(x, *); 1; end" parses "{%\n2 unless 1; 3\n%}" parses "{%\n2 unless 1; 3\n%}" sets correct locations of MacroVar in MacroIf / else sets correct locations of MacroVar in MacroIf / else says syntax error on "->(x, y z) { }" says syntax error on "->(x, y z) { }" parses "struct Foo < Bar :Qux end" parses "struct Foo < Bar :Qux end" parses "def self.==; end;" parses "def self.==; end;" parses "foo.% do end" parses "foo.% do end" parses "lib LibC\n$errno : B, C -> D\nend" parses "lib LibC\n$errno : B, C -> D\nend" parses "foo(\na: 1,\n)" parses "foo(\na: 1,\n)" parses "def <(); end;" parses "def <(); end;" parses "f.x = - 1" parses "f.x = - 1" parses "def foo(def foo); end" parses "def foo(def foo); end" parses "[1, 2]" parses "[1, 2]" parses "Foo(_)" parses "Foo(_)" says syntax error on "def foo(**a foo); end" says syntax error on "def foo(**a foo); end" parses "[\n1\n]" parses "[\n1\n]" parses "a()/3" parses "a()/3" sets correct location of var in proc pointer sets correct location of var in proc pointer parses "1 === 2" parses "1 === 2" redefine pseudo-method says syntax error on "def responds_to?; end" says syntax error on "def responds_to?; end" says syntax error on "def as; end" says syntax error on "def as; end" says syntax error on "def self.!; end" says syntax error on "def self.!; end" says syntax error on "def is_a?; end" says syntax error on "def is_a?; end" says syntax error on "macro as?; end" says syntax error on "macro as?; end" says syntax error on "macro responds_to?; end" says syntax error on "macro responds_to?; end" says syntax error on "def self.nil?; end" says syntax error on "def self.nil?; end" says syntax error on "def as?; end" says syntax error on "def as?; end" says syntax error on "def self.as?; end" says syntax error on "def self.as?; end" says syntax error on "def self.as; end" says syntax error on "def self.as; end" says syntax error on "def !; end" says syntax error on "def !; end" says syntax error on "def nil?; end" says syntax error on "def nil?; end" says syntax error on "macro nil?; end" says syntax error on "macro nil?; end" says syntax error on "macro is_a?; end" says syntax error on "macro is_a?; end" says syntax error on "def self.is_a?; end" says syntax error on "def self.is_a?; end" says syntax error on "def self.responds_to?; end" says syntax error on "def self.responds_to?; end" says syntax error on "macro as; end" says syntax error on "macro as; end" parses "module Foo\ndef foo; end; end" parses "module Foo\ndef foo; end; 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" parses "foo(1)" parses "foo(1)" parses "x[..2]" parses "x[..2]" parses "foo % q()" parses "foo % q()" parses "while true; 1; end;" parses "while true; 1; end;" parses "with : Int32" parses "with : Int32" parses "property end : Int32" parses "property end : Int32" parses "puts %w{one two}" parses "puts %w{one two}" parses "enum : Int32" parses "enum : Int32" parses "_ = 1" parses "_ = 1" says syntax error on "a = next" says syntax error on "a = next" says syntax error on "class Foo'a'" says syntax error on "class Foo'a'" parses "property ensure : Int32" parses "property ensure : Int32" says syntax error on "def foo(in); end" says syntax error on "def foo(in); end" says syntax error on "self, x = 1, 2" says syntax error on "self, x = 1, 2" says syntax error on "next ^ 1" says syntax error on "next ^ 1" parses "property nil : Int32" parses "property nil : Int32" parses "def foo(enum foo); end" parses "def foo(enum foo); end" parses "def foo(pointerof foo); end" parses "def foo(pointerof foo); end" parses "foo.bar = {} of Int32 => Int32" parses "foo.bar = {} of Int32 => Int32" 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 "/(fo\#{\"bar\"}\#{1}o)/" parses "/(fo\#{\"bar\"}\#{1}o)/" says syntax error on "def foo(foo module); end" says syntax error on "def foo(foo module); end" parses "enum Foo; protected def foo; 1; end; end" parses "enum Foo; protected def foo; 1; end; end" parses "instance_alignof(\n Int32\n)" parses "instance_alignof(\n Int32\n)" says syntax error on "{1, 2\n,3}" says syntax error on "{1, 2\n,3}" parses "Foo({x: X, typeof: Y})" parses "Foo({x: X, typeof: Y})" says syntax error on "foo { |self| }" says syntax error on "foo { |self| }" parses "foo.+" parses "foo.+" parses "foo(0, n >= 2)" parses "foo(0, n >= 2)" says syntax error on "def foo(abstract); end" says syntax error on "def foo(abstract); end" parses "`foo\\``" parses "`foo\\``" parses "def foo(var); end" parses "def foo(var); end" says syntax error on "1 unless break" says syntax error on "1 unless break" parses "case 1\nin .bar?; 2; end" parses "case 1\nin .bar?; 2; end" parses "puts %w(one two)" parses "puts %w(one two)" parses "foo(a: n ** 2)" parses "foo(a: n ** 2)" parses "1 + 2" parses "1 + 2" parses "foo(0, n ** 2)" parses "foo(0, n ** 2)" says syntax error on "annotation Foo%x()" says syntax error on "annotation Foo%x()" parses "abstract class Foo; end" parses "abstract class Foo; end" parses "a.b &=\n1" parses "a.b &=\n1" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "case {1, 2}\nwhen {3, 4}, {5, 6}\n7\nend" parses "def foo(x @@instance_sizeof); end" parses "def foo(x @@instance_sizeof); end" says syntax error on "def foo(begin); end" says syntax error on "def foo(begin); end" parses "def foo(@struct); end" parses "def foo(@struct); end" parses "case : Int32" parses "case : Int32" parses "{%\nunless 1; 2; end; 3\n%}" parses "{%\nunless 1; 2; end; 3\n%}" says syntax error on "foo { |module| }" says syntax error on "foo { |module| }" parses "foo &.block[0]" parses "foo &.block[0]" says syntax error on "Foo(\"\": T)" says syntax error on "Foo(\"\": T)" parses "foo 1, a: 1, b: 2\n1" parses "foo 1, a: 1, b: 2\n1" sets correct location of implicit tuple literal of multi-return sets correct location of implicit tuple literal of multi-return sets correct location of annotation in enum sets correct location of annotation in enum parses "foo(n &- 2)" parses "foo(n &- 2)" says syntax error on "break + 1" says syntax error on "break + 1" says syntax error on "def foo(x : *Int32); end" says syntax error on "def foo(x : *Int32); end" parses "def ==(); end" parses "def ==(); end" parses "def >=(); end;" parses "def >=(); end;" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" parses "macro foo;bar{% if x %}body{% else %}body2{%end%}baz;end" parses "def foo(@@in); end" parses "def foo(@@in); end" parses "a, *b = 1, 2" parses "a, *b = 1, 2" parses "offsetof(\n Foo,\n @foo\n)" parses "offsetof(\n Foo,\n @foo\n)" parses "-> : Int32 { }" parses "-> : Int32 { }" parses "a = 1; pointerof(a)" parses "a = 1; pointerof(a)" parses "def foo(@@if); end" parses "def foo(@@if); end" parses "a = 1; yield a rescue a" parses "a = 1; yield a rescue a" parses "@foo/2" parses "@foo/2" parses "def foo(**args)\n1\nend" parses "def foo(**args)\n1\nend" says syntax error on "foo { |(extend)| }" says syntax error on "foo { |(extend)| }" says syntax error on "foo(1 2)" says syntax error on "foo(1 2)" parses "asm(\"nop\" : \"a\"(0))" parses "asm(\"nop\" : \"a\"(0))" parses "foo(0, n !~ 2)" parses "foo(0, n !~ 2)" parses "1.is_a?(\n Int32\n)" parses "1.is_a?(\n Int32\n)" parses "Foo(X, alignof(Int32))" parses "Foo(X, alignof(Int32))" parses "def foo(@until); end" parses "def foo(@until); end" parses "asm(\n\"nop\"\n:\n\"a\"(0)\n:\n\"b\"(1),\n\"c\"(2)\n)" parses "asm(\n\"nop\"\n:\n\"a\"(0)\n:\n\"b\"(1),\n\"c\"(2)\n)" parses "abstract def foo" parses "abstract def foo" says syntax error on "def foo(x : 1); end" says syntax error on "def foo(x : 1); end" says syntax error on "fun foo(x : Int32, x : Int64); end" says syntax error on "fun foo(x : Int32, x : Int64); end" parses "def >(); end;" parses "def >(); end;" says syntax error on "def foo(foo protected); end" says syntax error on "def foo(foo protected); end" says syntax error on "return <= 1" says syntax error on "return <= 1" parses "foo(a: n % 2)" parses "foo(a: n % 2)" says syntax error on "enum Foo : Int32[1]" says syntax error on "enum Foo : Int32[1]" parses "def foo(@protected); end" parses "def foo(@protected); end" parses "foo(n // 2)" parses "foo(n // 2)" says syntax error on "%r(" says syntax error on "%r(" says syntax error on "def foo(foo until); end" says syntax error on "def foo(foo until); end" parses "foo%i" parses "foo%i" parses "def foo(x @false); end" parses "def foo(x @false); end" parses "a = 1; a ensure a" parses "a = 1; a ensure a" says syntax error on "return ... 1" says syntax error on "return ... 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(X, instance_sizeof(Int32))" parses "Foo(X, instance_sizeof(Int32))" says syntax error on "alias Foo?" says syntax error on "alias Foo?" parses "def foo(x, **args)\n1\nend" parses "def foo(x, **args)\n1\nend" parses "enum Foo; A = 1; B; end" parses "enum Foo; A = 1; B; end" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "case {1}\nin {Foo(Int32)}; 2; end" parses "<<-FOO\n\t 1\n\t FOO" parses "<<-FOO\n\t 1\n\t FOO" parses "def self.[]; end" parses "def self.[]; end" parses "b.c &&= 1" parses "b.c &&= 1" parses "x.foo(a: 1, b: 2)" parses "x.foo(a: 1, b: 2)" parses "foo ensure 2" parses "foo ensure 2" parses "1.tap do; 1; rescue; 2; end" parses "1.tap do; 1; rescue; 2; end" parses "def foo; x { |_| 1 }; end" parses "def foo; x { |_| 1 }; end" sets correct location of Begin within another node sets correct location of Begin within another node parses "break" parses "break" parses "property yield : Int32" parses "property yield : Int32" parses "module Foo ->{} end" parses "module Foo ->{} end" parses "x = 1; foo x {\n}" parses "x = 1; foo x {\n}" 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 self.!~; end;" parses "def self.!~; end;" parses "->Foo.+(Int32)" parses "->Foo.+(Int32)" parses "{% begin %}%w< %s >{% end %}" parses "{% begin %}%w< %s >{% end %}" parses "{..2}" parses "{..2}" says syntax error on "def foo(struct); end" says syntax error on "def foo(struct); end" says syntax error on "foo { |while| }" says syntax error on "foo { |while| }" parses "foo do; 1; end" parses "foo do; 1; end" parses "foo(0, n < 2)" parses "foo(0, n < 2)" parses "->Foo.|(Int32)" parses "->Foo.|(Int32)" parses "def +(); end;" parses "def +(); end;" parses "foo.&(1, 2) { 3 }" parses "foo.&(1, 2) { 3 }" parses "Foo({*X, *{Y}})" parses "Foo({*X, *{Y}})" says syntax error on "def foo(**args = 1); end" says syntax error on "def foo(**args = 1); end" says syntax error on "1 if break" says syntax error on "1 if break" parses "->::Foo.foo" parses "->::Foo.foo" says syntax error on "break >= 1" says syntax error on "break >= 1" parses "{% unless 1; 2; end %}" parses "{% unless 1; 2; end %}" says syntax error on "foo { |(return)| }" says syntax error on "foo { |(return)| }" parses "->Foo.foo=" parses "->Foo.foo=" parses "1.=~(2)" parses "1.=~(2)" says syntax error on "b, 1 == 2, a = 4" says syntax error on "b, 1 == 2, a = 4" parses "a, *b = 1" parses "a, *b = 1" parses "@@a = uninitialized Foo" parses "@@a = uninitialized Foo" parses "\"\"" parses "\"\"" says syntax error on "enum Foo : Int32:qux" says syntax error on "enum Foo : Int32:qux" parses "foo[1] /2" parses "foo[1] /2" parses "macro foo(a, @[Foo] &block);end" parses "macro foo(a, @[Foo] &block);end" parses "foo &.@bar.baz" parses "foo &.@bar.baz" parses "{% if x %}body{% end %}" parses "{% if x %}body{% end %}" parses "case {1}\nin {false}; 2; end" parses "case {1}\nin {false}; 2; end" parses "def foo(x @unless); end" parses "def foo(x @unless); end" parses "yield 1 if true" parses "yield 1 if true" 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" parses "Foo(T?)" parses "Foo(T?)" parses "def foo(a, @[Foo] &block); end" parses "def foo(a, @[Foo] &block); end" says syntax error on "foo { |x, x| }" says syntax error on "foo { |x, x| }" parses "def foo(x @require); end" parses "def foo(x @require); end" parses "def foo(x : U) forall T, U; end" parses "def foo(x : U) forall T, U; end" parses "foo { |a, b| 1 }" parses "foo { |a, b| 1 }" parses "2 * 3 + 4 * 5" parses "2 * 3 + 4 * 5" parses "def foo(var : Int | Double); end" parses "def foo(var : Int | Double); end" says syntax error on "break > 1" says syntax error on "break > 1" parses "foo.bar=(*baz)" parses "foo.bar=(*baz)" says syntax error on "foo { |nil| }" says syntax error on "foo { |nil| }" says syntax error on "foo { |asm| }" says syntax error on "foo { |asm| }" parses "foo(0, n >> 2)" parses "foo(0, n >> 2)" parses "def self.|; end;" parses "def self.|; end;" parses "[\n1, 2]" parses "[\n1, 2]" parses "@[Foo(1, foo: 2\n)]" parses "@[Foo(1, foo: 2\n)]" parses "foo(&.as?(T).bar)" parses "foo(&.as?(T).bar)" says syntax error on "foo { |alias| }" says syntax error on "foo { |alias| }" parses "alias : Int32" parses "alias : Int32" parses "unless foo; 1; end" parses "unless foo; 1; end" parses "2 / 3 + 4 / 5" parses "2 / 3 + 4 / 5" parses "foo.!.!" parses "foo.!.!" parses "foo.!~ do end" parses "foo.!~ do end" parses "case 1\nin true; 2; end" parses "case 1\nin true; 2; end" parses "a.b <<=\n1" parses "a.b <<=\n1" says syntax error on "if 1 == 1 a; end" says syntax error on "if 1 == 1 a; end" says syntax error on "enum Foo : Int32 {|a|a}" says syntax error on "enum Foo : Int32 {|a|a}" parses "property when : Int32" parses "property when : Int32" says syntax error on "def foo(out); end" says syntax error on "def foo(out); end" parses "class Foo < self; end" parses "class Foo < self; end" parses "def foo(x @@fun); end" parses "def foo(x @@fun); end" says syntax error on "case 1\nwhen Int32; 2; in 2" says syntax error on "case 1\nwhen Int32; 2; in 2" parses "a = 1; a &-= 1" parses "a = 1; a &-= 1" says syntax error on "1 as Bar" says syntax error on "1 as Bar" says syntax error on "def foo(x : (Int32, Int32)); end" says syntax error on "def foo(x : (Int32, Int32)); end" parses "1 if 3" parses "1 if 3" parses "pointerof(@a)" parses "pointerof(@a)" parses "foo.[]=(1, 2)" parses "foo.[]=(1, 2)" says syntax error on "<<-'HEREDOC'" says syntax error on "<<-'HEREDOC'" parses "def foo(var1, var2); end" parses "def foo(var1, var2); end" says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "[\n\"foo\"\n\"bar\"\n]" says syntax error on "%i{{one}" says syntax error on "%i{{one}" parses "(baz; bar do\nend)" parses "(baz; bar do\nend)" parses "1 rescue 2 if 3" parses "1 rescue 2 if 3" parses "def *(); end" parses "def *(); end" parses "def foo(@@protected); end" parses "def foo(@@protected); end" parses "def foo(x @extend); end" parses "def foo(x @extend); end" parses "alignof(X)" parses "alignof(X)" says syntax error on "*a if true" says syntax error on "*a if true" parses "foo(z: 0, a: n !~ 2)" parses "foo(z: 0, a: n !~ 2)" parses "a = 1; a += 10 if a += 20" parses "a = 1; a += 10 if a += 20" says syntax error on "case 1\nwhen .&&(2)" says syntax error on "case 1\nwhen .&&(2)" parses "def <; end;" parses "def <; end;" parses "foo.!= 1, 2" parses "foo.!= 1, 2" parses "def foo(@extend); end" parses "def foo(@extend); end" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "case / /\nwhen / /\n/ /\nelse\n/ /\nend" parses "case / /; when / /; / /; else; / /; end" parses "case / /; when / /; / /; else; / /; end" says syntax error on "lib Foo; enum Bar%w()" says syntax error on "lib Foo; enum Bar%w()" sets correct location of `elsif` of if statement sets correct location of `elsif` of if statement parses "def foo(x @@protected); end" parses "def foo(x @@protected); end" parses "1;-2" parses "1;-2" says syntax error on "def foo(_ y); y; end" says syntax error on "def foo(_ y); y; end" parses "foo(Bar { 1 })" parses "foo(Bar { 1 })" parses "def foo(@typeof); end" parses "def foo(@typeof); end" parses "def foo(@instance_sizeof); end" parses "def foo(@instance_sizeof); end" parses "a = 1; a &*=\n1" parses "a = 1; a &*=\n1" parses "Foo::Bar?" parses "Foo::Bar?" parses "<<-FOO\n \t 1\n \t FOO" parses "<<-FOO\n \t 1\n \t FOO" parses ":\"\\\"foo\"" parses ":\"\\\"foo\"" parses "macro foo; 1 + 2; end" parses "macro foo; 1 + 2; end" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n HERE" parses "{% begin %}%q( %s ){% end %}" parses "{% begin %}%q( %s ){% end %}" says syntax warning on "foo { |bar?| }" says syntax warning on "foo { |bar?| }" says syntax error on "lib Foo%w()" says syntax error on "lib Foo%w()" parses "n + 2" parses "n + 2" parses "{1 => 2 / 3}" parses "{1 => 2 / 3}" parses "def foo(a, & : Int -> Double); end" parses "def foo(a, & : Int -> Double); end" parses "foo\n.bar" parses "foo\n.bar" parses "{% begin %}%( %s ){% end %}" parses "{% begin %}%( %s ){% end %}" says syntax error on "def f end" says syntax error on "def f end" says syntax error on "break ^ 1" says syntax error on "break ^ 1" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" parses "case a\nwhen b\n1 / 2\nelse\n1 / 2\nend" says syntax error on "foo { |(include)| }" says syntax error on "foo { |(include)| }" parses "yield if true" parses "yield if true" says syntax error on "Foo(x: X\n,y: Y)" says syntax error on "Foo(x: X\n,y: Y)" says syntax error on "return ** 1" says syntax error on "return ** 1" parses "foo = 1; foo +1" parses "foo = 1; foo +1" says syntax error on "foo { |(pointerof)| }" says syntax error on "foo { |(pointerof)| }" parses "&+ 1" parses "&+ 1" parses "def self.+; end;" parses "def self.+; end;" parses "next {1, 2}" parses "next {1, 2}" parses "def foo(x @@var); end" parses "def foo(x @@var); end" parses "foo.bar" parses "foo.bar" says syntax error on "def foo(\"bar\");end" says syntax error on "def foo(\"bar\");end" says syntax error on "class Foo(); end" says syntax error on "class Foo(); end" parses "def foo(a, &block); end" parses "def foo(a, &block); end" parses "f.x = Foo.new" parses "f.x = Foo.new" parses "def foo; yield; end" parses "def foo; yield; end" says syntax error on "class Foo%()" says syntax error on "class Foo%()" parses "a = 1; a/b" parses "a = 1; a/b" parses "@[Foo(1, foo: 2)]" parses "@[Foo(1, foo: 2)]" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" parses " def foo(\n @[Foo]\n id : Int32,\n @[Bar] name : String\n ); end" parses "->Foo.<(Int32)" parses "->Foo.<(Int32)" parses "def foo(var : Int**); end" parses "def foo(var : Int**); end" parses "def %(); end" parses "def %(); end" says syntax error on "foo { |(macro)| }" says syntax error on "foo { |(macro)| }" parses "is_a?(Const)" parses "is_a?(Const)" parses "until true; 1; end;" parses "until true; 1; end;" parses "def foo(@@out); end" parses "def foo(@@out); end" says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "->(x : Int32, x : Int32) {}" says syntax error on "def foo(self); end" says syntax error on "def foo(self); end" parses "foo(&.responds_to?(:foo))" parses "foo(&.responds_to?(:foo))" parses ":**" parses ":**" says syntax error on "def foo=(&block); end" says syntax error on "def foo=(&block); end" says syntax error on "lib Foo'a'" says syntax error on "lib Foo'a'" parses "->(x : Int32) { }" parses "->(x : Int32) { }" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "<<-HERE\n foo\#{1}bar\n baz\n HERE" parses "def foo(&block :\n Int ->); end" parses "def foo(&block :\n Int ->); end" parses "foo./ 1, 2" parses "foo./ 1, 2" says syntax error on "enum Foo : Int32{1}" says syntax error on "enum Foo : Int32{1}" says syntax error on "foo &.bar.[] 0 =(1)" says syntax error on "foo &.bar.[] 0 =(1)" says syntax error on "break >> 1" says syntax error on "break >> 1" parses "1 && 2" parses "1 && 2" parses "def foo(@@begin); end" parses "def foo(@@begin); end" parses "def foo(bar? foo); end" parses "def foo(bar? foo); end" parses "class Foo(Type); end" parses "class Foo(Type); end" parses "def foo(x @return); end" parses "def foo(x @return); end" parses "->Foo.foo!" parses "->Foo.foo!" parses "typeof(\n 1\n)" parses "typeof(\n 1\n)" parses "def foo(@var); end" parses "def foo(@var); end" parses "foo = 1; foo &x" parses "foo = 1; foo &x" says syntax error on "{1 => 2 3 => 4}" says syntax error on "{1 => 2 3 => 4}" parses "def foo(\"bar qux\" y); y; end" parses "def foo(\"bar qux\" y); y; end" says syntax error on "def foo(x: Int32); end" says syntax error on "def foo(x: Int32); end" parses "a.foo, *a.bar = 1" parses "a.foo, *a.bar = 1" parses "responds_to?(:foo)" parses "responds_to?(:foo)" parses "lib LibC\nfun getchar : (->)?\nend" parses "lib LibC\nfun getchar : (->)?\nend" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2))" says syntax error on "foo &.[] 0 =(1)" says syntax error on "foo &.[] 0 =(1)" parses "def foo(false foo); end" parses "def foo(false foo); end" parses "{% begin %}%q{ %s }{% end %}" parses "{% begin %}%q{ %s }{% end %}" says syntax error on "case 1\nin Int32; 2; else" says syntax error on "case 1\nin Int32; 2; else" parses "until true; end;" parses "until true; end;" parses "foo.bar.as(Bar)" parses "foo.bar.as(Bar)" parses "def !=(); end;" parses "def !=(); end;" parses "1 / 2" parses "1 / 2" says syntax error on ":bar foo" says syntax error on ":bar foo" parses "foo(0, n <= 2)" parses "foo(0, n <= 2)" says syntax error on "foo { |(typeof)| }" says syntax error on "foo { |(typeof)| }" parses ":[]=" parses ":[]=" parses "module Foo include Bar end" parses "module Foo include Bar end" says syntax error on "fun Foo : Int64\nend" says syntax error on "fun Foo : Int64\nend" parses "n * 2" parses "n * 2" parses "module Foo %() end" parses "module Foo %() end" says syntax error on "foo.responds_to?" says syntax error on "foo.responds_to?" says syntax error on "break & 1" says syntax error on "break & 1" parses "->::foo?" parses "->::foo?" parses "def foo(a, &block : *Int -> ); end" parses "def foo(a, &block : *Int -> ); end" parses "case 1\nin Foo(Int32); 2; end" parses "case 1\nin Foo(Int32); 2; end" says syntax error on "a = 1, b = 2" says syntax error on "a = 1, b = 2" parses "def foo(@@fun); end" parses "def foo(@@fun); end" parses "property unless : Int32" parses "property unless : Int32" parses "1 + /foo/" parses "1 + /foo/" parses "def foo(var : Char[N]); end" parses "def foo(var : Char[N]); end" parses "<<-HERE\n One \\n Two\n Zero\n HERE" parses "<<-HERE\n One \\n Two\n Zero\n HERE" says syntax error on "def foo(until); end" says syntax error on "def foo(until); end" parses "foo.>=(1, 2) { 3 }" parses "foo.>=(1, 2) { 3 }" parses "def self.>; end;" parses "def self.>; end;" parses "foo do\n//\nend" parses "foo do\n//\nend" says syntax error on "enum Foo'a'" says syntax error on "enum Foo'a'" parses "{% begin %}%Q( %s ){% end %}" parses "{% begin %}%Q( %s ){% end %}" parses "def foo; yield(1); end" parses "def foo; yield(1); end" parses "[1, 2] of Int" parses "[1, 2] of Int" parses "self / number" parses "self / number" parses "foo { |a, (b, c), (d, e)| a; b; c; d; e }" parses "foo { |a, (b, c), (d, e)| a; b; c; d; e }" parses "{A::B => 1, C::D => 2}" parses "{A::B => 1, C::D => 2}" parses "next 1, 2" parses "next 1, 2" parses "-> { }" parses "-> { }" parses "def self.foo=()\n1\nend" parses "def self.foo=()\n1\nend" parses "{[] of Foo, Bar::Baz * 2}" parses "{[] of Foo, Bar::Baz * 2}" parses "foo.<= do end" parses "foo.<= do end" parses "Foo(T)" parses "Foo(T)" says syntax error on "a {}, b = 1" says syntax error on "a {}, b = 1" parses "{/ / => / /, / / => / /}" parses "{/ / => / /, / / => / /}" parses "foo(a: 1, &block)" parses "foo(a: 1, &block)" parses "foo = 1; ->foo./(Int32)" parses "foo = 1; ->foo./(Int32)" parses "foo.|(1, 2)" parses "foo.|(1, 2)" parses "struct Foo [1] end" parses "struct Foo [1] end" parses "def |(); end;" parses "def |(); end;" parses "true" parses "true" parses "foo.** 1, 2" parses "foo.** 1, 2" says syntax error on "Foo(T, x: U)" says syntax error on "Foo(T, x: U)" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" says syntax error on "lib Foo; fun foo(x : Int32, x : Int64); end" says syntax error on "a, b, c, d, *e = 1, 2, 3" says syntax error on "a, b, c, d, *e = 1, 2, 3" parses "a = 1; a /b" parses "a = 1; a /b" says syntax error on "def foo(module); end" says syntax error on "def foo(module); end" parses "foo./(1, 2)" parses "foo./(1, 2)" parses "n === 2" parses "n === 2" parses "macro foo(x)\n 1 + 2; end" parses "macro foo(x)\n 1 + 2; end" parses "lib LibC\n$errno = Foo : Int32\nend" parses "lib LibC\n$errno = Foo : Int32\nend" parses "foo.& 1, 2" parses "foo.& 1, 2" parses "a.b() /3" parses "a.b() /3" parses "call ->foo" parses "call ->foo" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" says syntax error on "{one: :two, three: :four} of Symbol => Symbol" parses "{[] of Foo, Bar::Baz + 2}" parses "{[] of Foo, Bar::Baz + 2}" parses "def foo(x @sizeof); end" parses "def foo(x @sizeof); end" parses "def foo(@@select); end" parses "def foo(@@select); end" parses "foo &.@bar" parses "foo &.@bar" parses "def foo(nil foo); end" parses "def foo(nil foo); end" parses "property in : Int32" parses "property in : Int32" says syntax error on "{{ {{ 1 }} }}" says syntax error on "{{ {{ 1 }} }}" says syntax error on "foo { |(sizeof)| }" says syntax error on "foo { |(sizeof)| }" says syntax error on "@:Foo" says syntax error on "@:Foo" parses "def foo(x @@true); end" parses "def foo(x @@true); end" says syntax error on "lib Foo; enum Bar'a'" says syntax error on "lib Foo; enum Bar'a'" says syntax error on "{\"a\" : 1}" says syntax error on "{\"a\" : 1}" says syntax error on " {1, 2, 3 end" says syntax error on " {1, 2, 3 end" parses "foo { |a| 1 }" parses "foo { |a| 1 }" parses "n << 2" parses "n << 2" parses "/ /" parses "/ /" parses "return;" parses "return;" parses "def foo(x) : Int32\n1\nend" parses "def foo(x) : Int32\n1\nend" parses "def foo(with foo); end" parses "def foo(with foo); end" parses "while true; end\nif true; end" parses "while true; end\nif true; end" parses "->() : Int32 { }" parses "->() : Int32 { }" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "begin; 1; rescue ex : Foo | Bar; 2; end" parses "class Foo; end\nwhile true; end" parses "class Foo; end\nwhile true; end" parses "def ^(); end;" parses "def ^(); end;" parses "n =~ 2" parses "n =~ 2" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "lib LibC; struct Foo; {% if 1 %}2{% end %}; end; end" parses "foo(z: 0, a: n =~ 2)" parses "foo(z: 0, a: n =~ 2)" parses "%w{one\\}}" parses "%w{one\\}}" parses "foo out _" parses "foo out _" says syntax error on "annotation Foo->(x : Qux){}" says syntax error on "annotation Foo->(x : Qux){}" parses "1_u128" parses "1_u128" says syntax error on "foo.[]? = 1" says syntax error on "foo.[]? = 1" sets correct location of proc literal sets correct location of proc literal says syntax error on "annotation Foo:Qux" says syntax error on "annotation Foo:Qux" says syntax error on "foo :: Foo" says syntax error on "foo :: Foo" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "asm(\"nop\" :: \"b\"(1), \"c\"(2) ::)" parses "a[0], a[1] = 1, 2" parses "a[0], a[1] = 1, 2" says syntax error on "self = 1" says syntax error on "self = 1" parses "@@foo/2" parses "@@foo/2" parses "require : Int32" parses "require : Int32" parses "foo(/ /)" parses "foo(/ /)" parses "macro foo(bar? foo); end" parses "macro foo(bar? foo); end" parses "lib LibFoo\nend\nif true\nend" parses "lib LibFoo\nend\nif true\nend" 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 "foo { |enum| }" says syntax error on "foo { |enum| }" says syntax error on "*a == 1" says syntax error on "*a == 1" says syntax error on "lib Foo; enum Bar:qux" says syntax error on "lib Foo; enum Bar:qux" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "lib LibC\n$errno : Int32\n$errno2 : Int32\nend" parses "foo.- 1, 2" parses "foo.- 1, 2" parses "def foo; a = 1; with a yield a; end" parses "def foo; a = 1; with a yield a; end" parses "macro foo(@[Foo] var);end" parses "macro foo(@[Foo] var);end" parses "1 ** -x" parses "1 ** -x" says syntax error on "struct Foo%w()" says syntax error on "struct Foo%w()" says syntax error on "->() :Int32 { }" says syntax error on "->() :Int32 { }" says syntax error on "foo { |in| }" says syntax error on "foo { |in| }" parses "foo(a: n < 2)" parses "foo(a: n < 2)" says syntax error on "case 1; when break; end; end" says syntax error on "case 1; when break; end; end" says syntax error on "<<-HEREDOC\n" says syntax error on "<<-HEREDOC\n" parses "`foo`" parses "`foo`" parses ":\u304B\u305F\u306A" parses ":\u304B\u305F\u306A" parses "foo.bar 1, 2" parses "foo.bar 1, 2" parses "a @b-1\nc" parses "a @b-1\nc" parses "property typeof : Int32" parses "property typeof : Int32" says syntax error on "lib Foo{1}" says syntax error on "lib Foo{1}" parses "foo.bar do end" parses "foo.bar do end" parses "1 ^ 2" parses "1 ^ 2" parses "a = 1; a ^= 1" parses "a = 1; a ^= 1" parses "a = 1; a //= 1" parses "a = 1; a //= 1" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" says syntax error on "def foo(x : {sizeof(Int32), 2}); end" parses "property fun : Int32" parses "property fun : Int32" parses "1 / -2" parses "1 / -2" says syntax error on "foo { |macro| }" says syntax error on "foo { |macro| }" says syntax error on "while 1 == 1 a; end" says syntax error on "while 1 == 1 a; end" parses "lib Foo::Bar\nend" parses "lib Foo::Bar\nend" parses "1 <=> 2" parses "1 <=> 2" says syntax error on "annotation Foo%w()" says syntax error on "annotation Foo%w()" parses "property begin : Int32" parses "property begin : Int32" says syntax error on "return &** 1" says syntax error on "return &** 1" parses "def foo(x @@struct); end" parses "def foo(x @@struct); end" parses "foo % x()" parses "foo % x()" parses "def self.===(); end;" parses "def self.===(); end;" parses "{% begin %}%r|\\A|{% end %}" parses "{% begin %}%r|\\A|{% end %}" parses "foo(z: 0, a: n == 2)" parses "foo(z: 0, a: n == 2)" parses "unless foo; 1; else; 2; end" parses "unless foo; 1; else; 2; end" parses "begin; 1; rescue ex; 2; end; ex" parses "begin; 1; rescue ex; 2; end; ex" parses "foo % w()" parses "foo % w()" says syntax error on "struct Foo->(x : Qux){}" says syntax error on "struct Foo->(x : Qux){}" parses "{{ foo }}" parses "{{ foo }}" parses "-> do; 1; rescue; 2; end" parses "-> do; 1; rescue; 2; end" sets the correct location for MacroExpressions in a MacroIf sets the correct location for MacroExpressions in a MacroIf sets correct location of trailing ensure sets correct location of trailing ensure parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "enum Foo; A = 1\ndef foo; 1; end; end" parses "1.as(\n Int32\n)" parses "1.as(\n Int32\n)" says syntax error on "lib Foo; union Bar[1]" says syntax error on "lib Foo; union Bar[1]" 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 "struct Foo \"a\" end" parses "struct Foo \"a\" end" parses "case 1\nwhen .!()\n2\nend" parses "case 1\nwhen .!()\n2\nend" parses "def self.==(); end;" parses "def self.==(); end;" parses "def foo(x @@offsetof); end" parses "def foo(x @@offsetof); end" parses "def foo(x, *args, y = 2); 1; end" parses "def foo(x, *args, y = 2); 1; end" parses "def foo(x @@macro); end" parses "def foo(x @@macro); end" parses "n | 2" parses "n | 2" says syntax error on "break - 1" says syntax error on "break - 1" parses "foo.!~(1, 2) { 3 }" parses "foo.!~(1, 2) { 3 }" sets correct location and end location of parenthesized block sets correct location and end location of parenthesized block parses ":\"\\\\foo\"" parses ":\"\\\\foo\"" parses "puts %i(one two)" parses "puts %i(one two)" says syntax error on "foo { |(break)| }" says syntax error on "foo { |(break)| }" 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" parses "->Foo.<<(Int32)" parses "->Foo.<<(Int32)" parses "def self.|(); end;" parses "def self.|(); end;" parses "(1; 2; 3)" parses "(1; 2; 3)" parses "def self.foo\n1\nend" parses "def self.foo\n1\nend" says syntax error on "-> :Int32 { }" says syntax error on "-> :Int32 { }" says syntax error on "def foo &block ; end" says syntax error on "def foo &block ; end" parses "{% a = 1 %}" parses "{% a = 1 %}" parses "def foo; a = 1; a; end" parses "def foo; a = 1; a; end" parses "foo.** do end" parses "foo.** do end" parses "case {1}\nin {.bar?}; 2; end" parses "case {1}\nin {.bar?}; 2; end" says syntax error on "1 ... break" says syntax error on "1 ... break" says syntax error on "enum Foo : Int32->{}" says syntax error on "enum Foo : Int32->{}" parses "{% unless 1; 2; else 3; end %}" parses "{% unless 1; 2; else 3; end %}" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\r\n \"\#{2} world\"" parses "if foo\n1\nend" parses "if foo\n1\nend" says syntax error on "enum Foo : Int32%()" says syntax error on "enum Foo : Int32%()" parses "foo bar.baz(1) do\nend" parses "foo bar.baz(1) do\nend" parses "foo x do\n//\nend" parses "foo x do\n//\nend" parses "1..;" parses "1..;" parses "property until : Int32" parses "property until : Int32" parses "a\nwhile / /\n/ /\nend" parses "a\nwhile / /\n/ /\nend" parses "case 1\nin Int32; 2; end" parses "case 1\nin Int32; 2; end" parses "property asm : Int32" parses "property asm : Int32" parses "-1.0" parses "-1.0" parses "begin\n1\nensure\n2\nend" parses "begin\n1\nensure\n2\nend" says syntax error on "%w{{one}" says syntax error on "%w{{one}" parses "foo % r()" parses "foo % r()" says syntax error on "*a" says syntax error on "*a" parses "1 -2" parses "1 -2" parses "__FILE__" parses "__FILE__" says syntax error on "def foo():String\nend" says syntax error on "def foo():String\nend" parses "[] of ->\n1" parses "[] of ->\n1" parses "{% begin %}%< %s >{% end %}" parses "{% begin %}%< %s >{% end %}" says syntax error on "return[0]" says syntax error on "return[0]" 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(foo true); end" says syntax error on "def foo(foo true); end" parses "x = 1 ensure 2" parses "x = 1 ensure 2" parses "module Foo ->(x : Bar){} end" parses "module Foo ->(x : Bar){} end" parses "foo(Foo: 1, Bar: 2)" parses "foo(Foo: 1, Bar: 2)" parses "foo **bar" parses "foo **bar" parses "%r(foo(bar))" parses "%r(foo(bar))" parses "foo(a: n === 2)" parses "foo(a: n === 2)" parses "Foo(T, {x: X})" parses "Foo(T, {x: X})" parses "foo(&.bar.baz)" parses "foo(&.bar.baz)" parses "Set() {1, 2, 3}" parses "Set() {1, 2, 3}" parses "foo.[]= 1, 2" parses "foo.[]= 1, 2" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "<<-HERE\r\n One\r\n Zero\r\n HERE\r\n" parses "foo bar!" parses "foo bar!" says syntax error on "def foo(return); end" says syntax error on "def foo(return); end" parses "1\n-2" parses "1\n-2" says syntax error on "return[]" says syntax error on "return[]" says syntax error on "macro foo; {% foo = 1 }; end" says syntax error on "macro foo; {% foo = 1 }; end" says syntax error on "module Foo->(x : Qux){}" says syntax error on "module Foo->(x : Qux){}" says syntax error on "def foo(foo sizeof); end" says syntax error on "def foo(foo sizeof); end" parses "def foo(@@def); end" parses "def foo(@@def); end" parses "1 ensure 2 if 3" parses "1 ensure 2 if 3" parses "def foo(@@module); end" parses "def foo(@@module); end" parses "foo(//)" parses "foo(//)" says syntax error on "def foo *y; 1; end" says syntax error on "def foo *y; 1; end" parses "def foo(@unless); end" parses "def foo(@unless); end" says syntax error on "def foo(if); end" says syntax error on "def foo(if); end" says syntax error on "foo { |(if)| }" says syntax error on "foo { |(if)| }" parses "foo(a: n - 2)" parses "foo(a: n - 2)" says syntax error on "foo { |(alias)| }" says syntax error on "foo { |(alias)| }" parses "foo.Bar" parses "foo.Bar" parses "{\n1\n}" parses "{\n1\n}" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "foo(\"foo bar\": 1, \"baz\": 2)" parses "def foo(x @def); end" parses "def foo(x @def); end" says syntax warning on "def foo(foo bar?); end" says syntax warning on "def foo(foo bar?); end" parses "x : Foo(A, *B, C)" parses "x : Foo(A, *B, C)" parses "foo(a: n &* 2)" parses "foo(a: n &* 2)" says syntax error on "A = begin; 1; ensure; B = 1; end" says syntax error on "A = begin; 1; ensure; B = 1; end" parses "def foo(x @module); end" parses "def foo(x @module); end" parses "return" parses "return" parses "def foo(x @class); end" parses "def foo(x @class); end" parses "foo.< do end" parses "foo.< do end" says syntax error on "case when .foo? then 1; end" says syntax error on "case when .foo? then 1; end" parses "def foo(@@var = 1); 1; end" parses "def foo(@@var = 1); 1; end" parses "foo(\n1)" parses "foo(\n1)" parses "def >=(); end" parses "def >=(); end" says syntax error on "lib Foo; struct Bar:Qux" says syntax error on "lib Foo; struct Bar:Qux" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "macro foo\n <<-FOO\n \#{ %var }\n FOO\nend" parses "until : Int32" parses "until : Int32" parses "foo%w" parses "foo%w" parses "property rescue : Int32" parses "property rescue : Int32" says syntax error on "{1 => 2\n,3 => 4}" says syntax error on "{1 => 2\n,3 => 4}" parses "module Foo :bar end" parses "module Foo :bar end" parses "foo(0, n / 2)" parses "foo(0, n / 2)" says syntax error on "return < 1" says syntax error on "return < 1" parses "enum Foo; macro foo;end; end" parses "enum Foo; macro foo;end; end" parses "asm(\"bl trap\" :::: \"unwind\")" parses "asm(\"bl trap\" :::: \"unwind\")" says syntax error on "unless 1 == 1 a; end" says syntax error on "unless 1 == 1 a; end" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "case {1, 2}\nwhen {.foo, .bar}\n5\nend" parses "foo(z: 0, a: n | 2)" parses "foo(z: 0, a: n | 2)" parses "include Foo\nif true; end" parses "include Foo\nif true; end" parses "foo if 3" parses "foo if 3" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" parses "lib LibC; enum Foo; A\nB; C\nD = 1; end end" parses "return 1" parses "return 1" says syntax error on "lib Foo\"a\"" says syntax error on "lib Foo\"a\"" says syntax error on "lib Foo->{}" says syntax error on "lib Foo->{}" says syntax error on "def foo(foo case); end" says syntax error on "def foo(foo case); end" parses "def ===(); end" parses "def ===(); end" says syntax error on "foo x: 1, x: 1" says syntax error on "foo x: 1, x: 1" parses "foo !false" parses "foo !false" says syntax error on "foo { |extend| }" says syntax error on "foo { |extend| }" parses "foo.=~(1, 2) { 3 }" parses "foo.=~(1, 2) { 3 }" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" says syntax error on "Hash{\"foo\": 1, \"bar\": 2}" parses "def &(); end" parses "def &(); end" says syntax error on "class Foo < Bar->{}" says syntax error on "class Foo < Bar->{}" parses "Foo(X: U, Y: V)" parses "Foo(X: U, Y: V)" says syntax error on "return >= 1" says syntax error on "return >= 1" says syntax error on "def foo(foo end); end" says syntax error on "def foo(foo end); end" parses "def foo(@next); end" parses "def foo(@next); end" parses "->\n:\nInt32\n{\n}" parses "->\n:\nInt32\n{\n}" says syntax error on "lib Foo; enum Bar%()" says syntax error on "lib Foo; enum Bar%()" parses "{% begin %}%q| %s |{% end %}" parses "{% begin %}%q| %s |{% end %}" parses "foo { |(a, *b, c)| }" parses "foo { |(a, *b, c)| }" parses "lib LibC\nalias Foo = Bar\nend" parses "lib LibC\nalias Foo = Bar\nend" says syntax error on "enum Foo[1]" says syntax error on "enum Foo[1]" parses "def foo(next foo); end" parses "def foo(next foo); end" parses "foo.*" parses "foo.*" parses "def foo(return foo); end" parses "def foo(return foo); end" parses "1..\n2.." parses "1..\n2.." parses "'a'" parses "'a'" parses "(/ /)" parses "(/ /)" parses "macro foo(x, *y);end" parses "macro foo(x, *y);end" sets correct location for single node within another node sets correct location for single node within another node parses "foo.!~(1, 2)" parses "foo.!~(1, 2)" says syntax error on "return &- 1" says syntax error on "return &- 1" parses "def /(); end;" parses "def /(); end;" parses "foo %q()" parses "foo %q()" parses "def foo(x @var); end" parses "def foo(x @var); end" parses "def **(); end;" parses "def **(); end;" parses "%i(one\\ two)" parses "%i(one\\ two)" 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 "def foo(protected foo); end" parses "def foo(protected foo); end" parses "..2" parses "..2" parses "break 1" parses "break 1" parses "T/1" parses "T/1" parses ":+" parses ":+" parses "module Foo %x() end" parses "module Foo %x() end" says syntax error on "def foo=(**kwargs); end" says syntax error on "def foo=(**kwargs); end" parses "def foo(x y); y; end" parses "def foo(x y); y; end" says syntax error on "def foo(foo abstract); end" says syntax error on "def foo(foo abstract); end" parses "%i{foo\\nbar baz}" parses "%i{foo\\nbar baz}" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" parses "foo(\n begin\n result : Int32 = 1\n result\n end\n )" says syntax error on "foo { |(select)| }" says syntax error on "foo { |(select)| }" parses "def self.=~; end;" parses "def self.=~; end;" parses "{% unless 1; 2; end; %}" parses "{% unless 1; 2; end; %}" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "a = 1\ncase 1\nwhen a then 1\nend" parses "foo bar?" parses "foo bar?" parses "case 1; when 1; 2; else; 3; end" parses "case 1; when 1; 2; else; 3; end" says syntax error on "next ... 1" says syntax error on "next ... 1" parses "@[Foo(\"hello\")]" parses "@[Foo(\"hello\")]" says syntax error on "lib Foo; enum Bar->{}" says syntax error on "lib Foo; enum Bar->{}" parses "class Foo \"a\" end" parses "class Foo \"a\" end" parses "unless : Int32" parses "unless : Int32" parses "%q{hello \\n world}" parses "%q{hello \\n world}" says syntax error on "if break; end" says syntax error on "if break; end" parses "x = 2; foo do bar x end" parses "x = 2; foo do bar x end" parses "1 rescue 2" parses "1 rescue 2" 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)" sets correct location of vars in C struct sets correct location of vars in C struct says syntax error on "foo { |pointerof| }" says syntax error on "foo { |pointerof| }" says syntax error on "%Q(" says syntax error on "%Q(" says syntax error on "def foo:String\nend" says syntax error on "def foo:String\nend" parses "a = 1; a <<= 1" parses "a = 1; a <<= 1" says syntax error on "foo { |(fun)| }" says syntax error on "foo { |(fun)| }" parses "property while : Int32" parses "property while : Int32" says syntax error on "lib Foo; struct Bar{1}" says syntax error on "lib Foo; struct Bar{1}" says syntax error on "macro foo(**x, **y)" says syntax error on "macro foo(**x, **y)" parses "nil : Int32" parses "nil : Int32" parses "a = 1; (a)/b" parses "a = 1; (a)/b" parses "puts ~1" parses "puts ~1" parses "1.as?(Bar)" parses "1.as?(Bar)" parses "Foo.bar x.y do\nend" parses "Foo.bar x.y do\nend" says syntax error on "until next; end" says syntax error on "until next; end" parses "lib LibC\nfun getch = \"get.char\"\nend" parses "lib LibC\nfun getch = \"get.char\"\nend" parses "def foo(x @@require); end" parses "def foo(x @@require); end" parses "case;when true;1;end" parses "case;when true;1;end" parses "foo.-(1, 2) { 3 }" parses "foo.-(1, 2) { 3 }" parses "{foo:\"a\", bar:\"b\"}" parses "{foo:\"a\", bar:\"b\"}" parses ":\"\"" parses ":\"\"" says syntax error on "case 1\nin 1; 2" says syntax error on "case 1\nin 1; 2" says syntax error on "case 1 == 1; when 2 a; end" says syntax error on "case 1 == 1; when 2 a; end" parses "def foo(@macro); end" parses "def foo(@macro); end" parses "->Foo.&+(Int32)" parses "->Foo.&+(Int32)" parses "return *{1, 2}" parses "return *{1, 2}" parses "foo 1, **bar" parses "foo 1, **bar" parses "<<-HERE\n One\n Zero\n HERE" parses "<<-HERE\n One\n Zero\n HERE" parses "1 - 2" parses "1 - 2" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "{% if true %}\n{% end %}\n{% if true %}\n{% end %}" parses "a.b |=\n1" parses "a.b |=\n1" parses "def foo(@@break); end" parses "def foo(@@break); end" says syntax error on "A = foo { B = 1 }" says syntax error on "A = foo { B = 1 }" parses "class Foo {1} end" parses "class Foo {1} end" parses "def -(); end;" parses "def -(); end;" parses "lib : Int32" parses "lib : Int32" says syntax error on "foo { |out| }" says syntax error on "foo { |out| }" parses "(bar do\nend)" parses "(bar do\nend)" sets correct location for multiple nodes within another node sets correct location for multiple nodes within another node parses "foo(0, n > 2)" parses "foo(0, n > 2)" says syntax error on "'''" says syntax error on "'''" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "lib LibC; fun foo(a : ::B, ::C -> ::D); end" parses "def /(); end" parses "def /(); end" says syntax warning on "foo do |(bar?)|\nend" says syntax warning on "foo do |(bar?)|\nend" sets correct location for output macro expression in for loop sets correct location for output macro expression in for loop parses "return 1.bar do\nend" parses "return 1.bar do\nend" parses "foo(z: 0, a: n >> 2)" parses "foo(z: 0, a: n >> 2)" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "foo.^ do end" parses "foo.^ do end" parses "+1_i64" parses "+1_i64" parses "def =~; end;" parses "def =~; end;" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "macro foo; 1 + 2 {{foo}}\\ 3 + 4; end" parses "def self.<(); end;" parses "def self.<(); end;" says syntax warning on "macro foo(bar?); end" says syntax warning on "macro foo(bar?); end" parses "foo &.@bar.@baz" parses "foo &.@bar.@baz" says syntax error on "macro foo x; 1 + 2; end" says syntax error on "macro foo x; 1 + 2; end" parses "foo(n ** 2)" parses "foo(n ** 2)" parses "\"hello \"\\\r\n\"world\"" parses "\"hello \"\\\r\n\"world\"" parses "pointerof : Int32" parses "pointerof : Int32" says syntax error on "def foo(offsetof); end" says syntax error on "def foo(offsetof); end" parses "foo(z: 0, a: n === 2)" parses "foo(z: 0, a: n === 2)" sets correct location of splat in multiple assignment sets correct location of splat in multiple assignment parses "a = 1; a &+= 1" parses "a = 1; a &+= 1" parses "property include : Int32" parses "property include : Int32" parses "def foo(@if); end" parses "def foo(@if); end" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "<<-'HERE'\n hello \\n world\n \#{1}\n HERE" parses "foo(z: 0, a: n // 2)" parses "foo(z: 0, a: n // 2)" parses "def foo(@[Foo] *args); end" parses "def foo(@[Foo] *args); end" says syntax error on "macro Foo;end" says syntax error on "macro Foo;end" parses "n & 2" parses "n & 2" says syntax error on "Foo(X\n,Y)" says syntax error on "Foo(X\n,Y)" says syntax error on "foo[1] = return" says syntax error on "foo[1] = return" parses "foo(n >> 2)" parses "foo(n >> 2)" parses "{% if 1; 2; end %}" parses "{% if 1; 2; end %}" parses "a; unless / /; / /; else; / /; end" parses "a; unless / /; / /; else; / /; end" parses "foo = 1; ->foo.bar(Int32)" parses "foo = 1; ->foo.bar(Int32)" parses "{% begin %}%w{ %s }{% end %}" parses "{% begin %}%w{ %s }{% end %}" says syntax error on "1 if next" says syntax error on "1 if next" parses "{% begin %}%q[ %s ]{% end %}" parses "{% begin %}%q[ %s ]{% end %}" parses "@@a : Foo" parses "@@a : Foo" parses "def !~(); end" parses "def !~(); end" parses "foo = 1; ->foo.//(Int32)" parses "foo = 1; ->foo.//(Int32)" says syntax error on "class Foo(T U)" says syntax error on "class Foo(T U)" parses "def |; end;" parses "def |; end;" parses "->@@foo.foo" parses "->@@foo.foo" parses "puts a if true" parses "puts a if true" parses "def foo(@@end); end" parses "def foo(@@end); end" parses "foo(&.as(T))" parses "foo(&.as(T))" parses "a.b /=\n1" parses "a.b /=\n1" parses "def foo(@select); end" parses "def foo(@select); end" says syntax error on "fun foo\nclass" says syntax error on "fun foo\nclass" parses "def foo(@var); 1; end" parses "def foo(@var); 1; end" parses "1.as Bar" parses "1.as Bar" says syntax error on "macro foo(**x, y)" says syntax error on "macro foo(**x, y)" says syntax error on "class Foo < Bar%w()" says syntax error on "class Foo < Bar%w()" says syntax error on "lib Foo{|a|a}" says syntax error on "lib Foo{|a|a}" parses "def self.~(); end;" parses "def self.~(); end;" parses "def foo(abstract foo); end" parses "def foo(abstract foo); end" parses "break : Int32" parses "break : Int32" parses "foo Bar { 1 }" parses "foo Bar { 1 }" parses "macro foo;bar{% if x %}body{% end %}baz;end" parses "macro foo;bar{% if x %}body{% end %}baz;end" sets correct location of `else` of unless statement sets correct location of `else` of unless statement says syntax error on "foo { |(require)| }" says syntax error on "foo { |(require)| }" says syntax error on "foo(\"\": 1)" says syntax error on "foo(\"\": 1)" parses "pointerof(\n foo\n)" parses "pointerof(\n foo\n)" parses "lib LibC; union Foo; end end" parses "lib LibC; union Foo; end end" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "a\nunless / /\n/ /\nelse\n/ /\nend" parses "+1.0_f32" parses "+1.0_f32" parses "foo" parses "foo" parses "{% 2 unless 1; 3 %}" parses "{% 2 unless 1; 3 %}" parses "foo..2" parses "foo..2" says syntax error on "annotation Foo[1]" says syntax error on "annotation Foo[1]" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" parses "<<-HERE1; <<-HERE2\nHERE1\nhere2\nHERE2" says syntax error on "struct Foo->{}" says syntax error on "struct Foo->{}" says syntax error on "def foo(foo self); end" says syntax error on "def foo(foo self); end" parses "instance_sizeof : Int32" parses "instance_sizeof : Int32" says syntax error on "foo &.[]?(0) = 1" says syntax error on "foo &.[]?(0) = 1" says syntax error on "def foo!=; end" says syntax error on "def foo!=; end" parses "def foo(lib foo); end" parses "def foo(lib foo); end" parses "2**3**4" parses "2**3**4" parses "foo(z: 0, a: n - 2)" parses "foo(z: 0, a: n - 2)" parses "Foo(T, U, 1)" parses "Foo(T, U, 1)" parses "foo &.%(1)" parses "foo &.%(1)" says syntax error on "return // 1" says syntax error on "return // 1" parses "foo rescue 2" parses "foo rescue 2" parses "foo(z: 0, a: n % 2)" parses "foo(z: 0, a: n % 2)" parses "fun foo : Int32; 1; end; 2" parses "fun foo : Int32; 1; end; 2" parses "->Foo.!~(Int32)" parses "->Foo.!~(Int32)" parses "1.x; foo do\nend" parses "1.x; foo do\nend" parses "a = 1; a <<=\n1" parses "a = 1; a <<=\n1" parses "foo.responds_to? :foo" parses "foo.responds_to? :foo" says syntax error on "[\n]" says syntax error on "[\n]" parses "foo %i()" parses "foo %i()" parses "foo.!=(1, 2) { 3 }" parses "foo.!=(1, 2) { 3 }" says syntax error on "foo &.[](0)=(1)" says syntax error on "foo &.[](0)=(1)" says syntax error on "def foo(foo lib); end" says syntax error on "def foo(foo lib); end" says syntax error on "*a === 1" says syntax error on "*a === 1" parses "property macro : Int32" parses "property macro : Int32" says syntax error on "struct Foo:qux" says syntax error on "struct Foo:qux" parses "*a, b = 1, 2, 3, 4" parses "*a, b = 1, 2, 3, 4" says syntax error on "def foo(var : Foo+); end" says syntax error on "def foo(var : Foo+); end" says syntax error on "def foo var\n end" says syntax error on "def foo var\n end" says syntax error on "return > 1" says syntax error on "return > 1" says syntax error on "foo { |(self)| }" says syntax error on "foo { |(self)| }" parses "*a, b = 1" parses "*a, b = 1" parses "def /; end;" parses "def /; end;" says syntax error on "+return" says syntax error on "+return" says syntax error on "def foo(x : U) forall U,; end" says syntax error on "def foo(x : U) forall U,; end" parses "+1.0" parses "+1.0" parses "foo &.block(1)" parses "foo &.block(1)" parses "yield" parses "yield" parses "foo(n % 2)" parses "foo(n % 2)" parses "def foo(&@block); end" parses "def foo(&@block); end" parses "def foo(a, &block : Int -> Double); end" parses "def foo(a, &block : Int -> Double); end" says syntax error on "1 ? : 2 : 3" says syntax error on "1 ? : 2 : 3" parses "foo 1, a: 1, b: 2" parses "foo 1, a: 1, b: 2" parses "%Q{hello \\n world}" parses "%Q{hello \\n world}" parses "1.nil?(\n)" parses "1.nil?(\n)" parses "foo z: out x; x" parses "foo z: out x; x" parses "nil?" parses "nil?" parses "foo%Q" parses "foo%Q" says syntax error on "enum Foo{1}" says syntax error on "enum Foo{1}" parses "{\"\".id}" parses "{\"\".id}" sets location of enum method sets location of enum method says syntax error on "break .. 1" says syntax error on "break .. 1" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" parses "macro foo;bar{% for x in y %}body{% end %}baz;end" says syntax error on "foo { |begin| }" says syntax error on "foo { |begin| }" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" says syntax error on "<<-HERE\n One\n \#{1}\n Zero\n HERE" parses "->Foo.===(Int32)" parses "->Foo.===(Int32)" says syntax error on "return << 1" says syntax error on "return << 1" parses "begin; 1; rescue; 2; else; 3; end" parses "begin; 1; rescue; 2; else; 3; end" parses "foo(0, n | 2)" parses "foo(0, n | 2)" parses "def foo(x = 1, **args)\n1\nend" parses "def foo(x = 1, **args)\n1\nend" parses "def foo(x @@alias); end" parses "def foo(x @@alias); end" parses "foo &.as?(T).bar" parses "foo &.as?(T).bar" says syntax error on "class Foo(T, U V)" says syntax error on "class Foo(T, U V)" parses "yield foo do\nend" parses "yield foo do\nend" parses "foo = 1; ->foo.[]=(Int32)" parses "foo = 1; ->foo.[]=(Int32)" parses "call foo : A, end : B" parses "call foo : A, end : B" parses "1.[]=(2, 3)" parses "1.[]=(2, 3)" parses "->Foo./(Int32)" parses "->Foo./(Int32)" parses "def foo(var : Int, Float -> Double); end" parses "def foo(var : Int, Float -> Double); end" parses "1 -2.0" parses "1 -2.0" sets correct location of global path in class def sets correct location of global path in class def parses "def foo(var : Int32 -> = 1); end" parses "def foo(var : Int32 -> = 1); end" parses "def [](x); end" parses "def [](x); end" says syntax error on "unless next; end" says syntax error on "unless next; end" says syntax error on "annotation Foo{1}" says syntax error on "annotation Foo{1}" says syntax error on "class Foo:qux" says syntax error on "class Foo:qux" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "lib LibC; struct Foo; x : Int; y : Float; end end" parses "@@a : Foo = 1" parses "@@a : Foo = 1" says syntax error on "lib Foo; union Bar%w()" says syntax error on "lib Foo; union Bar%w()" says syntax error on "lib Foo; union Bar\"a\"" says syntax error on "lib Foo; union Bar\"a\"" parses ":<" parses ":<" parses "n ** 2" parses "n ** 2" says syntax error on "def foo(foo def); end" says syntax error on "def foo(foo def); end" parses "property protected : Int32" parses "property protected : Int32" says syntax error on "lib Foo; enum Bar{1}" says syntax error on "lib Foo; enum Bar{1}" parses "def self.=~(); end;" parses "def self.=~(); end;" says syntax error on "case x; when 'a'; 2; when 'a'; end" says syntax error on "case x; when 'a'; 2; when 'a'; end" says syntax error on "class Foo(*T, *U); end" says syntax error on "class Foo(*T, *U); end" parses "foo &.bar.baz" parses "foo &.bar.baz" says syntax error on "return.as(Int32)" says syntax error on "return.as(Int32)" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" says syntax error on "next == 1" says syntax error on "next == 1" parses "def >=; end;" parses "def >=; end;" parses "foo 1;" parses "foo 1;" parses "foo.+ 1, 2" parses "foo.+ 1, 2" says syntax error on "asm(\"\" ::: \"\"(var))" says syntax error on "asm(\"\" ::: \"\"(var))" parses "{{ foo &.nil? }}" parses "{{ foo &.nil? }}" says syntax error on "def foo(foo fun); end" says syntax error on "def foo(foo fun); end" parses "{% begin %}%[ %s ]{% end %}" parses "{% begin %}%[ %s ]{% end %}" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" parses "a ? 1\n : b ? 2\n : c ? 3\n : 0" says syntax error on "A = begin; B = 1; end" says syntax error on "A = begin; B = 1; end" parses "def foo(**args : **Foo)\n1\nend" parses "def foo(**args : **Foo)\n1\nend" parses "foo.> do end" parses "foo.> do end" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "macro foo;{% verbatim do %}1{% foo %}2{% end %};end" parses "foo.^ 1, 2" parses "foo.^ 1, 2" parses "2.3_f32" parses "2.3_f32" parses "def foo(@@var); 1; end" parses "def foo(@@var); 1; end" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "begin; 1; rescue ::Foo | ::Bar; 2; end" parses "/foo/imximx" parses "/foo/imximx" says syntax error on "def foo(foo select); end" says syntax error on "def foo(foo select); end" parses "{{ nil?(foo) }}" parses "{{ nil?(foo) }}" parses "a : Foo*" parses "a : Foo*" 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 "Foo({X: X, Y: Y})" parses "Foo({X: X, Y: Y})" parses "a = 1; a |= 1" parses "a = 1; a |= 1" says syntax error on "foo { |(yield)| }" says syntax error on "foo { |(yield)| }" says syntax error on "case 1 == 1 a; when 2; end" says syntax error on "case 1 == 1 a; when 2; end" parses "def self.**; end;" parses "def self.**; end;" parses "a == / /" parses "a == / /" says syntax error on "return / 1" says syntax error on "return / 1" parses "foo(a: 1, b: 2)" parses "foo(a: 1, b: 2)" says syntax error on "module Foo'a'" says syntax error on "module Foo'a'" says syntax error on "def foo(foo offsetof); end" says syntax error on "def foo(foo offsetof); end" parses "foo { 1 }" parses "foo { 1 }" says syntax error on "Hash {foo: 1} of Int32 => Int32" says syntax error on "Hash {foo: 1} of Int32 => Int32" parses "def foo(x @@nil); end" parses "def foo(x @@nil); end" says syntax error on "fun foo\nFoo = 1" says syntax error on "fun foo\nFoo = 1" says syntax error on "yield break" says syntax error on "yield break" says syntax error on "macro foo(x : Int32); end" says syntax error on "macro foo(x : Int32); end" parses "foo +1" parses "foo +1" parses "def self.>=(); end;" parses "def self.>=(); end;" parses "{1, 2, 3}" parses "{1, 2, 3}" says syntax error on "Foo(x: T y: U)" says syntax error on "Foo(x: T y: U)" parses "nil" parses "nil" parses "foo.|(1, 2) { 3 }" parses "foo.|(1, 2) { 3 }" says syntax error on "lib Foo; union Bar{|a|a}" says syntax error on "lib Foo; union Bar{|a|a}" parses "def foo(x @@abstract); end" parses "def foo(x @@abstract); end" parses "enum Foo; def foo; 1; end; end" parses "enum Foo; def foo; 1; end; end" parses "def foo(@@unless); end" parses "def foo(@@unless); end" parses "def self.<=; end;" parses "def self.<=; end;" says syntax error on "<<-'HERE\n" says syntax error on "<<-'HERE\n" says syntax error on "foo { |(true)| }" says syntax error on "foo { |(true)| }" parses "foo(n !~ 2)" parses "foo(n !~ 2)" parses "{A::B}" parses "{A::B}" says syntax error on "foo &.[]? 0 = 1" says syntax error on "foo &.[]? 0 = 1" parses "fun foo(x : Int32) : Int64\nx\nend" parses "fun foo(x : Int32) : Int64\nx\nend" parses "foo./(1, 2) { 3 }" parses "foo./(1, 2) { 3 }" parses "%w{one{} two}" parses "%w{one{} two}" parses "call @foo.bar" parses "call @foo.bar" says syntax error on "foo { |(until)| }" says syntax error on "foo { |(until)| }" parses "->Foo.==(Int32)" parses "->Foo.==(Int32)" parses "foo(bar:\"a\", baz:\"b\")" parses "foo(bar:\"a\", baz:\"b\")" says syntax error on "$foo :: Foo" says syntax error on "$foo :: Foo" parses "def foo; yield 1; yield; end" parses "def foo; yield 1; yield; end" parses "foo(bar:a, baz:b)" parses "foo(bar:a, baz:b)" says syntax error on "class Foo < Bar{|a|a}" says syntax error on "class Foo < Bar{|a|a}" says syntax error on "foo[next]" says syntax error on "foo[next]" parses "def foo(select foo); end" parses "def foo(select foo); end" parses "`foo\#{1}bar`" parses "`foo\#{1}bar`" parses "->Foo.=~(Int32)" parses "->Foo.=~(Int32)" parses "def foo(module foo); end" parses "def foo(module foo); end" parses "foo%x" parses "foo%x" says syntax error on "def foo(*args = 1); end" says syntax error on "def foo(*args = 1); end" parses "T::U/1" parses "T::U/1" parses "def self.>(); end;" parses "def self.>(); end;" parses "abstract def foo : Int32" parses "abstract def foo : Int32" parses "def foo(x, **args, &block)\n1\nend" parses "def foo(x, **args, &block)\n1\nend" parses "foo.!" parses "foo.!" sets location of lib fun name sets location of lib fun name parses "a.b >>=\n1" parses "a.b >>=\n1" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" says syntax error on "{% unless 1; 2; elsif 3; 4; end %}" gets correct location with (#1558) gets correct location with (#1558) parses "instance_sizeof(X)" parses "instance_sizeof(X)" parses "def foo(x @@yield); end" parses "def foo(x @@yield); end" parses "def foo(var : self*); end" parses "def foo(var : self*); end" parses "foo.>= do end" parses "foo.>= do end" parses "1/2" parses "1/2" parses "{% begin %}%w( %s ){% end %}" parses "{% begin %}%w( %s ){% end %}" parses "Set(Int32) {1, 2, 3}" parses "Set(Int32) {1, 2, 3}" says syntax error on "case x; when 1; 2; when 1; end" says syntax error on "case x; when 1; 2; when 1; end" parses "class Foo ->(x : Bar){} end" parses "class Foo ->(x : Bar){} end" says syntax warning on "foo do |foo, bar?|\nend" says syntax warning on "foo do |foo, bar?|\nend" parses "def foo(@with); end" parses "def foo(@with); end" parses "foo[0] = 1 if 2" parses "foo[0] = 1 if 2" parses "macro foo; bar class: 1; end" parses "macro foo; bar class: 1; end" parses "a = 1; class Foo; @x = a; end" parses "a = 1; class Foo; @x = a; end" parses "def foo(x @until); end" parses "def foo(x @until); end" says syntax warning on "def foo(bar?); end" says syntax warning on "def foo(bar?); end" says syntax error on "return ^ 1" says syntax error on "return ^ 1" parses "foo(x) do\n//\nend" parses "foo(x) do\n//\nend" parses "class Foo\nend" parses "class Foo\nend" parses "return *1" parses "return *1" parses "foo -1.0, -2.0" parses "foo -1.0, -2.0" parses "foo a: 1, &block" parses "foo a: 1, &block" parses "foo(&block)" parses "foo(&block)" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "macro foo\n <<-FOO\n %foo\n FOO\nend" parses "foo = 1; foo a: 1" parses "foo = 1; foo a: 1" parses "next 1 if true" parses "next 1 if true" parses "def ^(); end" parses "def ^(); end" parses "def foo(x @@module); end" parses "def foo(x @@module); end" says syntax error on "def foo(protected); end" says syntax error on "def foo(protected); end" parses "1 =~ 2" parses "1 =~ 2" parses "case foo; end" parses "case foo; end" parses "{%\nif 1; 2; end\n%}" parses "{%\nif 1; 2; end\n%}" parses "def foo(**args)\nargs\nend" parses "def foo(**args)\nargs\nend" parses "n &+ 2" parses "n &+ 2" parses "a = 1; a >>= 1" parses "a = 1; a >>= 1" parses "def *; end;" parses "def *; end;" parses "nil?( )" parses "nil?( )" parses "foo %r" parses "foo %r" parses "foo(n =~ 2)" parses "foo(n =~ 2)" says syntax error on "struct Foo'a'" says syntax error on "struct Foo'a'" parses "foo = 1; b = 2; foo -b" parses "foo = 1; b = 2; foo -b" parses "/foo/x" parses "/foo/x" parses "def %; end;" parses "def %; end;" parses "n / 2" parses "n / 2" says syntax error on "annotation Foo:qux" says syntax error on "annotation Foo:qux" parses "class Foo(*T); end" parses "class Foo(*T); end" parses "{%\nif 1; 2; end; 3\n%}" parses "{%\nif 1; 2; end; 3\n%}" parses "->foo(Int32, Float64)" parses "->foo(Int32, Float64)" says syntax error on "macro foo;{%end};end" says syntax error on "macro foo;{%end};end" says syntax error on "asm(\"\" : 1)" says syntax error on "asm(\"\" : 1)" parses "...2" parses "...2" parses "property break : Int32" parses "property break : Int32" parses "->@@foo.foo?" parses "->@@foo.foo?" says syntax error on "{a: 1, a: 2}" says syntax error on "{a: 1, a: 2}" says syntax error on "{\n}" says syntax error on "{\n}" says syntax error on "foo { |(enum)| }" says syntax error on "foo { |(enum)| }" parses "foo &.!" parses "foo &.!" parses "foo(z: 0, a: n &* 2)" parses "foo(z: 0, a: n &* 2)" parses "{% begin %}%r[\\A]{% end %}" parses "{% begin %}%r[\\A]{% end %}" parses "foo.responds_to?(:foo)" parses "foo.responds_to?(:foo)" parses "[] of {String, ->}" parses "[] of {String, ->}" parses "property pointerof : Int32" parses "property pointerof : Int32" parses "def ==(); end;" parses "def ==(); end;" says syntax error on "def foo(foo macro); end" says syntax error on "def foo(foo macro); end" parses "property true : Int32" parses "property true : Int32" says syntax error on "foo { |(offsetof)| }" says syntax error on "foo { |(offsetof)| }" says syntax error on "break[0]= 1" says syntax error on "break[0]= 1" parses "def foo(a, &block : Int -> ); end" parses "def foo(a, &block : Int -> ); end" parses "in : Int32" parses "in : Int32" says syntax error on "<<-'HEREDOC'\n" says syntax error on "<<-'HEREDOC'\n" says syntax error on "enum Foo : Int32%w()" says syntax error on "enum Foo : Int32%w()" parses "def : Int32" parses "def : Int32" parses "def foo(x @enum); end" parses "def foo(x @enum); end" parses "Foo({String, ->, ->})" parses "Foo({String, ->, ->})" says syntax error on "case x; when 1; when _; end" says syntax error on "case x; when 1; when _; end" sets location of += sets location of += parses "class Foo [1] end" parses "class Foo [1] end" parses "->Foo.[]=(Int32)" parses "->Foo.[]=(Int32)" parses "foo &->bar" parses "foo &->bar" parses "class Foo(T1); end" parses "class Foo(T1); end" parses "foo.[0]" parses "foo.[0]" sets correct location of receiver var in method def sets correct location of receiver var in method def parses "lib LibC; fun foo : Int*; end" parses "lib LibC; fun foo : Int*; end" parses ":~" parses ":~" parses "{% begin %}%x| %s |{% end %}" parses "{% begin %}%x| %s |{% end %}" parses "foo = 1; ->foo.+(Int32)" parses "foo = 1; ->foo.+(Int32)" parses "def foo(x @pointerof); end" parses "def foo(x @pointerof); end" parses "def foo(typeof foo); end" parses "def foo(typeof foo); end" parses "a = 1; a %=\n1" parses "a = 1; a %=\n1" parses "false : Int32" parses "false : Int32" says syntax error on "foo { |yield| }" says syntax error on "foo { |yield| }" parses "n >= 2" parses "n >= 2" says syntax error on "next << 1" says syntax error on "next << 1" parses ":!=" parses ":!=" says syntax error on "enum Foo{|a|a}" says syntax error on "enum Foo{|a|a}" says syntax error on "module Foo{|a|a}" says syntax error on "module Foo{|a|a}" parses "def &(); end;" parses "def &(); 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 parses "foo.| do end" parses "foo.| do end" parses "struct Foo %w() end" parses "struct Foo %w() end" parses "sizeof(\n Int32\n)" parses "sizeof(\n Int32\n)" parses "Foo(*T)" parses "Foo(*T)" parses "n == 2" parses "n == 2" parses "yield 1" parses "yield 1" parses "foo &.[] = 1" parses "foo &.[] = 1" parses "yield : Int32" parses "yield : Int32" says syntax error on "false foo" says syntax error on "false foo" says syntax error on "next &- 1" says syntax error on "next &- 1" parses "foo(a: n * 2)" parses "foo(a: n * 2)" parses "foo(z: 0, a: n * 2)" parses "foo(z: 0, a: n * 2)" parses "Foo(typeof(1))" parses "Foo(typeof(1))" says syntax error on "a = 1; a += break" says syntax error on "a = 1; a += break" parses "a : Foo()[12]" parses "a : Foo()[12]" parses "a = 1; b = 2; c = 3; a-b -c" parses "a = 1; b = 2; c = 3; a-b -c" says syntax error on "def foo(*x, &x); end" says syntax error on "def foo(*x, &x); end" says syntax error on "unless return; end" says syntax error on "unless return; end" says syntax error on "foo **bar, 1" says syntax error on "foo **bar, 1" parses "->::foo!" parses "->::foo!" parses "foo(n >= 2)" parses "foo(n >= 2)" parses "/\\ /" parses "/\\ /" says syntax error on "foo { |lib| }" says syntax error on "foo { |lib| }" says syntax error on "case 1\nin _;" says syntax error on "case 1\nin _;" parses "def foo(if foo); end" parses "def foo(if foo); end" parses "foo %w()" parses "foo %w()" says syntax error on "{a: 1, \"\": 2}" says syntax error on "{a: 1, \"\": 2}" parses "::A::B" parses "::A::B" parses "def foo(@sizeof); end" parses "def foo(@sizeof); end" parses "def foo(x @@return); end" parses "def foo(x @@return); end" says syntax error on "A = foo(B = 1)" says syntax error on "A = foo(B = 1)" sets correct location of annotation in lib sets correct location of annotation in lib says syntax error on "1 unless return" says syntax error on "1 unless return" parses "foo % Q()" parses "foo % Q()" parses "lib LibC; type A = B.class; end" parses "lib LibC; type A = B.class; end" parses "abstract struct Foo; end" parses "abstract struct Foo; end" parses "foo.!=(1, 2)" parses "foo.!=(1, 2)" parses "foo %i" parses "foo %i" parses "a = 1; a -=\n1" parses "a = 1; a -=\n1" parses "def foo(@@pointerof); end" parses "def foo(@@pointerof); end" parses "def foo(@[Foo] var); end" parses "def foo(@[Foo] var); end" parses "->(x : Int32) { x }" parses "->(x : Int32) { x }" says syntax error on "def foo(x : U) forall; end" says syntax error on "def foo(x : U) forall; end" says syntax error on "annotation Foo%()" says syntax error on "annotation Foo%()" parses "def foo(require foo); end" parses "def foo(require foo); end" parses "foo.-(1, 2)" parses "foo.-(1, 2)" parses "def foo(begin foo); end" parses "def foo(begin foo); end" parses "def foo(x @lib); end" parses "def foo(x @lib); end" parses "macro foo\n'\\''\nend" parses "macro foo\n'\\''\nend" parses "lib LibC; struct Foo; {{ 1 }}; end; end" parses "lib LibC; struct Foo; {{ 1 }}; end; end" says syntax error on "class Foo{1}" says syntax error on "class Foo{1}" says syntax error on "1 ... return" says syntax error on "1 ... return" parses "def foo(var = 1); end" parses "def foo(var = 1); end" parses "class : Int32" parses "class : Int32" parses "{% begin %}%i[ %s ]{% end %}" parses "{% begin %}%i[ %s ]{% end %}" says syntax error on "def foo(x, *); 1; end" says syntax error on "def foo(x, *); 1; end" sets correct location of MacroIf within another node sets correct location of MacroIf within another node parses "{{ //.options }}" parses "{{ //.options }}" says syntax error on "annotation Foo'a'" says syntax error on "annotation Foo'a'" parses "1 | 2" parses "1 | 2" parses "1.as(Bar)" parses "1.as(Bar)" parses "Foo(Bar(T | U))" parses "Foo(Bar(T | U))" parses "_, _ = 1, 2" parses "_, _ = 1, 2" says syntax error on "foo { |include| }" says syntax error on "foo { |include| }" says syntax error on "lib Foo%()" says syntax error on "lib Foo%()" says syntax error on "def foo @@var, █ end" says syntax error on "def foo @@var, █ end" parses "Int[8, 4,]" parses "Int[8, 4,]" 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 "{\"x\": [] of Int32,\n}\n1.foo(" says syntax error on "{\"x\": [] of Int32,\n}\n1.foo(" parses ":-" parses ":-" parses "def ~; end;" parses "def ~; end;" parses "foo { |(_, c)| c }" parses "foo { |(_, c)| c }" parses "lib LibC; fun foo(a : Int**); end" parses "lib LibC; fun foo(a : Int**); end" says syntax error on "foo &.[](0) = 1" says syntax error on "foo &.[](0) = 1" parses ":===" parses ":===" parses "puts __FILE__" parses "puts __FILE__" says syntax error on "foo { |false| }" says syntax error on "foo { |false| }" parses "asm(\"nop\" :: : :)" parses "asm(\"nop\" :: : :)" says syntax error on "+next" says syntax error on "+next" parses "lib LibC; struct Foo; end end" parses "lib LibC; struct Foo; end end" parses "->Foo.-(Int32)" parses "->Foo.-(Int32)" says syntax error on "<<-FOO\n1\nFOO.bar" says syntax error on "<<-FOO\n1\nFOO.bar" parses "def foo(x @macro); end" parses "def foo(x @macro); end" says syntax error on "def foo(foo out); end" says syntax error on "def foo(foo out); end" parses "foo.=== do end" parses "foo.=== do end" parses "property elsif : Int32" parses "property elsif : Int32" parses "return if true" parses "return if true" parses "def foo; x { |a| a }; end" parses "def foo; x { |a| a }; end" parses "extend : Int32" parses "extend : Int32" parses "as?(Bar)" parses "as?(Bar)" says syntax error on "return[0]= 1" says syntax error on "return[0]= 1" parses "foo(a: n =~ 2)" parses "foo(a: n =~ 2)" parses "def >>(); end" parses "def >>(); end" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "case 1\nwhen 1\n2\nend\nif a\nend" parses "def foo(x @@def); end" parses "def foo(x @@def); end" parses "Foo(T, 1)" parses "Foo(T, 1)" says syntax error on "foo { |sizeof| }" says syntax error on "foo { |sizeof| }" says syntax error on "return 1 foo" says syntax error on "return 1 foo" parses "yield;" parses "yield;" parses "{foo:a, bar:b}" parses "{foo:a, bar:b}" says syntax error on "def foo() :String\nend" says syntax error on "def foo() :String\nend" parses "foo.bar(1, 2) { 3 }" parses "foo.bar(1, 2) { 3 }" parses "foo()" parses "foo()" parses "foo(z: 0, a: n ** 2)" parses "foo(z: 0, a: n ** 2)" parses "a.b *=\n1" parses "a.b *=\n1" says syntax error on "a.b(), c.d = 1" says syntax error on "a.b(), c.d = 1" parses "foo(a: n !~ 2)" parses "foo(a: n !~ 2)" parses "property next : Int32" parses "property next : Int32" parses "<<-HERE\n One\n \n Zero\n HERE" parses "<<-HERE\n One\n \n Zero\n HERE" parses "foo 1.bar do\nend" parses "foo 1.bar do\nend" parses "def foo; yield 1; end" parses "def foo; yield 1; end" parses "foo(0, n * 2)" parses "foo(0, n * 2)" says syntax error on "x { |*a, *b| }" says syntax error on "x { |*a, *b| }" says syntax error on "enum Foo {|a|a}" says syntax error on "enum Foo {|a|a}" says syntax error on "if 1\n foo 1,\nend" says syntax error on "if 1\n foo 1,\nend" sets correct location of instance variable in proc pointer sets correct location of instance variable in proc pointer parses "1 * 2" parses "1 * 2" parses "def foo(@break); end" parses "def foo(@break); end" says syntax error on "require 1" says syntax error on "require 1" parses "a = 1" parses "a = 1" says syntax error on "lib Foo; enum Bar[1]" says syntax error on "lib Foo; enum Bar[1]" parses "foo(n + 2)" parses "foo(n + 2)" says syntax error on "next[]" says syntax error on "next[]" parses "private : Int32" parses "private : Int32" parses "macro foo;%var;end" parses "macro foo;%var;end" parses "def Foo::Bar.foo\n1\nend" parses "def Foo::Bar.foo\n1\nend" parses "n // 2" parses "n // 2" sets correct location and end location of `begin` block sets correct location and end location of `begin` block parses "(1 .. )" parses "(1 .. )" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" says syntax error on "<<-HERE\n One\nwrong\n Zero\n HERE" parses "def foo(@@case); end" parses "def foo(@@case); end" sets correct location for fun def with body sets correct location for fun def with body parses "macro foo\n'\\\\'\nend" parses "macro foo\n'\\\\'\nend" says syntax error on "*1, a = 2" says syntax error on "*1, a = 2" parses ":<<" parses ":<<" parses "x = 0; a, b = x += 1" parses "x = 0; a, b = x += 1" parses "def ~(); end;" parses "def ~(); end;" parses "def !~; end;" parses "def !~; end;" parses "puts {{*1}}" parses "puts {{*1}}" parses "enum Foo::Bar; A = 1; end" parses "enum Foo::Bar; A = 1; end" sets correct location of MacroIf (unless) within another node sets correct location of MacroIf (unless) within another node parses "foo(a: n <= 2)" parses "foo(a: n <= 2)" parses "module Foo 'a' end" parses "module Foo 'a' end" parses "def foo(@private); end" parses "def foo(@private); end" parses "case \nwhen 1\n2\nend" parses "case \nwhen 1\n2\nend" says syntax error on "{{ {% begin %} }}" says syntax error on "{{ {% begin %} }}" parses "lib LibC; type A = B*; end" parses "lib LibC; type A = B*; end" parses "def Foo.foo\n1\nend" parses "def Foo.foo\n1\nend" parses "->foo?" parses "->foo?" parses "annotation Foo::Bar\n\nend" parses "annotation Foo::Bar\n\nend" sets correct location for fun def on multiple lines sets correct location for fun def on multiple lines says syntax error on "next ** 1" says syntax error on "next ** 1" parses "1 > 2" parses "1 > 2" says syntax error on "a = break" says syntax error on "a = break" parses "def foo(a, &block : -> Double); end" parses "def foo(a, &block : -> Double); end" parses "foo(a: n &+ 2)" parses "foo(a: n &+ 2)" parses "foo 1, **bar, &block" parses "foo 1, **bar, &block" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" parses "\"hello \#{1}\" \\\n \"\#{2} world\"" says syntax error on "def foo(x @@x); 1; end" says syntax error on "def foo(x @@x); 1; end" parses "foo(n / 2)" parses "foo(n / 2)" parses "Foo(\"foo\": U, \"bar\": V)" parses "Foo(\"foo\": U, \"bar\": V)" parses "foo(regex: //)" parses "foo(regex: //)" parses "def foo(x @true); end" parses "def foo(x @true); end" says syntax error on "foo[1] = break" says syntax error on "foo[1] = break" parses "foo.%(1, 2) { 3 }" parses "foo.%(1, 2) { 3 }" parses "foo.& do end" parses "foo.& do end" says syntax error on "foo[1] = next" says syntax error on "foo[1] = next" parses "next if true" parses "next if true" parses "foo(1.., 2)" parses "foo(1.., 2)" parses "property do : Int32" parses "property do : Int32" says syntax warning on "def foo(bar!); end" says syntax warning on "def foo(bar!); end" says syntax error on "break << 1" says syntax error on "break << 1" says syntax error on "@[Foo(\"\": 1)]" says syntax error on "@[Foo(\"\": 1)]" parses "1 +2_i64" parses "1 +2_i64" says syntax error on "def foo(break); end" says syntax error on "def foo(break); end" says syntax error on "foo { |(def)| }" says syntax error on "foo { |(def)| }" parses "lib LibC\nfun getch = GetChar\nend" parses "lib LibC\nfun getch = GetChar\nend" parses "{{ foo.nil? }}" parses "{{ foo.nil? }}" parses "module Foo %w() end" parses "module Foo %w() end" sets correct locations of macro if / else / elsif sets correct locations of macro if / else / elsif parses "property enum : Int32" parses "property enum : Int32" says syntax error on "case return; when 1; end; end" says syntax error on "case return; when 1; end; end" says syntax error on "lib Foo; enum Bar\"a\"" says syntax error on "lib Foo; enum Bar\"a\"" says syntax error on "next >> 1" says syntax error on "next >> 1" parses "foo(1, **bar)" parses "foo(1, **bar)" says syntax error on "def foo(foo asm); end" says syntax error on "def foo(foo asm); end" says syntax error on "while next; end" says syntax error on "while next; end" says syntax error on "1 .. return" says syntax error on "1 .. return" parses "foo[] /2" parses "foo[] /2" parses "return *1, 2" parses "return *1, 2" parses "foo(0, n &** 2)" parses "foo(0, n &** 2)" says syntax warning on "macro foo(foo bar?); end" says syntax warning on "macro foo(foo bar?); end" parses "foo(n < 2)" parses "foo(n < 2)" parses "x([] of Foo, Bar.new)" parses "x([] of Foo, Bar.new)" parses "foo &.as(T)" parses "foo &.as(T)" says syntax error on "case 1\nin .nil?; 2" says syntax error on "case 1\nin .nil?; 2" parses "class Foo\ndef foo; end; end" parses "class Foo\ndef foo; end; end" says syntax error on "def foo(true); end" says syntax error on "def foo(true); end" says syntax error on "lib Foo; struct Bar[1]" says syntax error on "lib Foo; struct Bar[1]" parses "foo &.block[]" parses "foo &.block[]" parses "/\\//" parses "/\\//" parses "macro foo\neenum\nend" parses "macro foo\neenum\nend" parses "1.tap do |x|; 1; rescue; x; end" parses "1.tap do |x|; 1; rescue; x; end" says syntax error on "foo &.[]?(0)=(1)" says syntax error on "foo &.[]?(0)=(1)" parses "else : Int32" parses "else : Int32" parses "->::Foo.foo=" parses "->::Foo.foo=" parses "macro foo;end" parses "macro foo;end" parses "r = 1; r.x += 2" parses "r = 1; r.x += 2" parses "n &* 2" parses "n &* 2" parses "def foo(@@asm); end" parses "def foo(@@asm); end" parses "->Foo.>(Int32)" parses "->Foo.>(Int32)" says syntax error on "next // 1" says syntax error on "next // 1" parses "foo(0, n - 2)" parses "foo(0, n - 2)" parses "foo %Q()" parses "foo %Q()" parses "\n\n__LINE__" parses "\n\n__LINE__" parses "def <=; end;" parses "def <=; end;" says syntax error on "def foo=(a = 1, b = 2); end" says syntax error on "def foo=(a = 1, b = 2); end" parses "def <=(); end;" parses "def <=(); end;" says syntax error on "a = 1; a += return" says syntax error on "a = 1; a += return" parses "{[] of Foo, ::Bar::Baz.new}" parses "{[] of Foo, ::Bar::Baz.new}" parses "def []=(value); end" parses "def []=(value); end" parses "enum Foo : UInt16 # comment\nend" parses "enum Foo : UInt16 # comment\nend" says syntax error on "Foo{one: :two, three: :four}" says syntax error on "Foo{one: :two, three: :four}" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}\\ baz;end" parses "macro foo;bar{% for x in y %}\\ \n body{% end %}\\ baz;end" parses "lib LibC; type A = B**; end" parses "lib LibC; type A = B**; end" says syntax error on "def foo(fun); end" says syntax error on "def foo(fun); end" parses "asm(\"nop\" ::: :)" parses "asm(\"nop\" ::: :)" says syntax error on "enum Foo : Int32'a'" says syntax error on "enum Foo : Int32'a'" says syntax error on "case x; when _; end" says syntax error on "case x; when _; end" parses "def foo(@case); end" parses "def foo(@case); end" says syntax warning on "macro foo(bar!); end" says syntax warning on "macro foo(bar!); end" parses "def foo(@[Foo] outer inner); end" parses "def foo(@[Foo] outer inner); end" parses "1 * -2" parses "1 * -2" parses "{% begin %}%q< %s >{% end %}" parses "{% begin %}%q< %s >{% end %}" parses "def %(); end;" parses "def %(); end;" parses "begin; 1; end;" parses "begin; 1; end;" parses "def self.foo=\n1\nend" parses "def self.foo=\n1\nend" parses "def foo(x @@case); end" parses "def foo(x @@case); end" parses "def foo ; 1 ; end" parses "def foo ; 1 ; end" says syntax error on "def foo(x = 1, y); end" says syntax error on "def foo(x = 1, y); end" parses "<<-HERE\nHERE" parses "<<-HERE\nHERE" parses "def foo(x @break); end" parses "def foo(x @break); 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 self.>=; end;" parses "def self.>=; end;" parses "foo &.block = 0" parses "foo &.block = 0" parses "def foo(var : Int?); end" parses "def foo(var : Int?); end" parses "lib LibC\nfun getchar\nend" parses "lib LibC\nfun getchar\nend" says syntax error on "1 unless next" says syntax error on "1 unless next" parses "def self.^(); end;" parses "def self.^(); end;" says syntax error on "class Foo < Bar%x()" says syntax error on "class Foo < Bar%x()" parses "A.new(\"x\", B.new(\"y\"))" parses "A.new(\"x\", B.new(\"y\"))" parses "def foo\n1\nend" parses "def foo\n1\nend" parses "a b() {}" parses "a b() {}" parses "case 1\nelse\n2\nend" parses "case 1\nelse\n2\nend" parses "{% begin %}%i< %s >{% end %}" parses "{% begin %}%i< %s >{% end %}" says syntax error on "enum Foo%()" says syntax error on "enum Foo%()" says syntax error on "foo &.[0]? += 1" says syntax error on "foo &.[0]? += 1" 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" says syntax error on "foo { |protected| }" says syntax error on "foo { |protected| }" parses "protected : Int32" parses "protected : Int32" parses "foo = 1; ->foo.>(Int32)" parses "foo = 1; ->foo.>(Int32)" parses "\"hello \"\\\n\"world\"" parses "\"hello \"\\\n\"world\"" parses "\"foo\#{bar}baz\"" parses "\"foo\#{bar}baz\"" parses "def foo(x @asm); end" parses "def foo(x @asm); end" says syntax error on "foo { |offsetof| }" says syntax error on "foo { |offsetof| }" parses "asm(\"nop\" \n)" parses "asm(\"nop\" \n)" parses "@a, b = 1, 2" parses "@a, b = 1, 2" says syntax error on "def =\nend" says syntax error on "def =\nend" parses "foo.|" parses "foo.|" parses "case 1; when 0, 1; 2; else; 3; end" parses "case 1; when 0, 1; 2; else; 3; end" says syntax error on "def foo(x, x); end" says syntax error on "def foo(x, x); end" parses "->(x : Int32) : Int32 { }" parses "->(x : Int32) : Int32 { }" parses "struct Foo :Bar end" parses "struct Foo :Bar end" says syntax error on "enum Foo%x()" says syntax error on "enum Foo%x()" says syntax error on "class Foo(X\n,Y); 1; end" says syntax error on "class Foo(X\n,Y); 1; end" parses "{% 2 if 1; 3 %}" parses "{% 2 if 1; 3 %}" parses "1 +2" parses "1 +2" says syntax error on "macro foo *y;end" says syntax error on "macro foo *y;end" parses "-@@foo" parses "-@@foo" parses "def **(); end" parses "def **(); end" parses "class Foo < Bar; end" parses "class Foo < Bar; end" says syntax error on "next - 1" says syntax error on "next - 1" parses "puts _" parses "puts _" parses "def foo(@@nil); end" parses "def foo(@@nil); end" parses "def foo(x @private); end" parses "def foo(x @private); end" says syntax error on "def foo(foo include); end" says syntax error on "def foo(foo include); end" parses "foo + 1" parses "foo + 1" parses "def foo(x = __FILE__); end" parses "def foo(x = __FILE__); end" sets correct location of trailing rescue sets correct location of trailing rescue says syntax error on "{1, ->{ |_| x } }" says syntax error on "{1, ->{ |_| x } }" says syntax error on "*a, *b = 1" says syntax error on "*a, *b = 1" parses "foo.* 1, 2" parses "foo.* 1, 2" says syntax error on "foo { |def| }" says syntax error on "foo { |def| }" says syntax error on "foo {1, 2}" says syntax error on "foo {1, 2}" parses "foo\n .bar" parses "foo\n .bar" parses "foo.=~ 1, 2" parses "foo.=~ 1, 2" parses "def foo(@enum); end" parses "def foo(@enum); end" says syntax error on "{a[]: 1}" says syntax error on "{a[]: 1}" parses "case {1, 2}\nwhen foo\n5\nend" parses "case {1, 2}\nwhen foo\n5\nend" says syntax error on "enum Foo < UInt16; end" says syntax error on "enum Foo < UInt16; 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 "Foo(X, instance_alignof(Int32))" parses "Foo(X, instance_alignof(Int32))" says syntax error on "Hash{\"foo\": 1}" says syntax error on "Hash{\"foo\": 1}" parses "a[] = 1" parses "a[] = 1" says syntax error on "{1 => 2, 3 => 4 5 => 6}" says syntax error on "{1 => 2, 3 => 4 5 => 6}" parses "1 & 2" parses "1 & 2" parses "foo.!( )" parses "foo.!( )" parses "foo(out x); x" parses "foo(out x); x" says syntax error on "return ? 1 : 2" says syntax error on "return ? 1 : 2" parses "(a;\nb)" parses "(a;\nb)" parses "->Foo.foo?" parses "->Foo.foo?" parses "%w{\\{one}" parses "%w{\\{one}" says syntax error on "def foo(case); end" says syntax error on "def foo(case); end" parses "foo { a = 1 }; a" parses "foo { a = 1 }; a" parses "{% unless 1; 2; end; 3 %}" parses "{% unless 1; 2; end; 3 %}" parses "begin : Int32" parses "begin : Int32" parses "def <(); end" parses "def <(); end" parses "-@foo" parses "-@foo" parses "{[] of Foo, Bar::Baz ** 2}" parses "{[] of Foo, Bar::Baz ** 2}" parses "macro foo(@[Foo] *args);end" parses "macro foo(@[Foo] *args);end" parses "foo out x; x" parses "foo out x; x" parses "if foo\n1\nelse\n2\nend" parses "if foo\n1\nelse\n2\nend" parses "{[] of Foo, ::foo}" parses "{[] of Foo, ::foo}" parses "case when 1\n2\nend" parses "case when 1\n2\nend" says syntax error on "annotation Foo\"a\"" says syntax error on "annotation Foo\"a\"" parses "Foo(typeof(1), typeof(2))" parses "Foo(typeof(1), typeof(2))" says syntax error on "next / 1" says syntax error on "next / 1" parses "x : *T -> R" parses "x : *T -> R" says syntax error on "enum Foo%w()" says syntax error on "enum Foo%w()" parses "def //(); end" parses "def //(); end" says syntax error on "case break; when 1; end; end" says syntax error on "case break; when 1; end; end" parses "1 +\n2" parses "1 +\n2" says syntax error on "%x(" says syntax error on "%x(" says syntax error on "lib Foo; struct Bar'a'" says syntax error on "lib Foo; struct Bar'a'" parses "1 \\\r\n + 2" parses "1 \\\r\n + 2" parses "next 1, *2" parses "next 1, *2" says syntax error on "break | 1" says syntax error on "break | 1" says syntax error on "module Foo[1]" says syntax error on "module Foo[1]" says syntax error on "lib Foo; union Bar'a'" says syntax error on "lib Foo; union Bar'a'" parses "macro foo(\na = 0\n)\nend" parses "macro foo(\na = 0\n)\nend" Crystal::Repl::Interpreter enum does enum value does enum value does enum new does enum new Semantic: c union errors on empty c union (#633) errors on empty c union (#633) errors if using void in union field type errors if using void in union field type types union getter types union getter types union setter via pointer types union setter via pointer errors if setting closure errors if setting closure types union getter via pointer types union getter via pointer types Union#new types Union#new errors if using void via typedef in union field type errors if using void via typedef in union field type types c union types c union types union setter types union setter Semantic: responds_to? is bool is bool restricts virtual generic superclass to subtypes restricts virtual generic superclass to subtypes restricts in assignment restricts in assignment restricts type inside if scope 1 restricts type inside if scope 1 restricts other types inside if else restricts other types inside if else restricts virtual generic module to including types (#8334) restricts virtual generic module to including types (#8334) read_file with relative path reads file (doesn't exist) reads file (doesn't exist) reads file (exists) reads file (exists) with absolute path reads file (exists) reads file (exists) reads file (doesn't exist) reads file (doesn't exist) Semantic: module errors if reopening generic module with different splat index errors if reopening generic module with different splat index inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T uses type declaration inside module, recursive, and gives error uses type declaration inside module, recursive, and gives error type def does not reopen type from parent namespace (#11181) type def does not reopen type from parent namespace (#11181) errors if reopening generic module with different splat index (3) errors if reopening generic module with different splat index (3) gives error when trying to instantiate with allocate gives error when trying to instantiate with allocate includes generic module with self (check return type, success) includes generic module with self (check return type, success) includes module in a module includes module in a module allows overloading with included generic module allows overloading with included generic module types pointer of module with method types pointer of module with method can't reopen as class can't reopen as class gives error with cyclic include, generic module gives error with cyclic include, generic module includes generic module explicitly and errors includes generic module explicitly and errors includes generic module with self (check argument type, success) includes generic module with self (check argument type, success) can instantiate generic module can instantiate generic module includes module with Union(T*) includes module with Union(T*) errors if declares module inside if errors if declares module inside if can use generic module as instance variable type (2) can use generic module as instance variable type (2) types proc of module after type changes types proc of module after type changes errors if reopening generic module with different type vars (2) errors if reopening generic module with different type vars (2) declares module automatically if not previously declared when declaring a class declares module automatically if not previously declared when declaring a class inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete finds class method in block finds class method in block types union of module and class that includes it types union of module and class that includes it gives error when including self gives error when including self instantiates generic variadic module, accesses T from class method through generic extend instantiates generic variadic module, accesses T from class method through generic extend extends self extends self errors when extending self and self defines instance vars (2) (#9568) errors when extending self and self defines instance vars (2) (#9568) 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 return type, error) includes generic module with self (check return type, error) reports can't use instance variables inside module reports can't use instance variables inside module instantiates generic variadic module, accesses T from class method instantiates generic variadic module, accesses T from class method includes generic module with type includes generic module with type extends a module extends a module 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 types pointer of module with method with two including types types pointer of module with method with two including types includes generic module and errors in call includes generic module and errors in call includes generic module with self includes generic module with self gives error with cyclic include gives error with cyclic include initializes variable in module, recursive initializes variable in module, recursive finds types close to included module finds types close to included module inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete finds constant in generic module included in another module finds constant in generic module included in another module works ok in a case where a typed-def type has an underlying type that has an included generic module (bug) works ok in a case where a typed-def type has an underlying type that has an included generic module (bug) errors when recursively extending module that defines instance vars (2) errors when recursively extending module that defines instance vars (2) uses type declaration inside module uses type declaration inside module errors if including generic module and not specifying type vars errors if including generic module and not specifying type vars 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 through generic include, more args instantiates generic variadic module, accesses T from instance method through generic include, more args gives helpful error message when generic type var is missing gives helpful error message when generic type var is missing instantiates generic variadic module, accesses T from instance method, more args instantiates generic variadic module, accesses T from instance method, more args errors when extending module that defines instance vars (#4065) errors when extending module that defines instance vars (#4065) includes generic module with another generic type includes generic module with another generic type can use generic module as instance variable type can use generic module as instance variable type can restrict module with module (#3029) can restrict module with module (#3029) includes module but wrong number of arguments includes module but wrong number of arguments doesn't lookup type in ancestor when matches in current type (#2982) doesn't lookup type in ancestor when matches in current type (#2982) finds in module when included finds in module when included errors when extending generic module that defines instance vars errors when extending generic module that defines instance vars includes generic module explicitly includes generic module explicitly extends module from generic class and calls class method (#7167) extends module from generic class and calls class method (#7167) errors if reopening generic module with different type vars errors if reopening generic module with different type vars works with range and map works with range and map includes generic module with self (check return subclass type, error) includes generic module with self (check return subclass type, error) calls super on included generic module and finds type var (2) calls super on included generic module and finds type var (2) includes module in a class includes module in a class includes module but not generic includes module but not generic finds nested type inside method in block inside module finds nested type inside method in block inside module calls super on included generic module and finds type var calls super on included generic module and finds type var 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 extending module that defines instance vars (2) (#4065) errors when extending module that defines instance vars (2) (#4065) 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) extends generic module from generic class and calls class method (#7167) extends generic module from generic class and calls class method (#7167) errors when recursively extending module that defines instance vars errors when recursively extending module that defines instance vars uses type declaration inside module and gives error uses type declaration inside module and gives error types pointer of module with generic type types pointer of module with generic type includes but not a module includes but not a module declares module automatically if not previously declared when declaring a module declares module automatically if not previously declared when declaring a module finds inner class from inherited one (#476) finds inner class from inherited one (#476) extends generic module from generic module and calls class method (#7167) extends generic module from generic module and calls class method (#7167) initializes variable in module initializes variable in module errors when extending self and self defines instance vars (3) (#9568) errors when extending self and self defines instance vars (3) (#9568) gives error when trying to instantiate with new gives error when trying to instantiate with new types pointer of module types pointer of module includes module but can't access metaclass methods includes module but can't access metaclass methods includes generic module with self (check argument type, error) includes generic module with self (check argument type, error) instantiates generic variadic module, accesses T from instance method instantiates generic variadic module, accesses T from instance method types pointer of module with generic type types pointer of module with generic type calls super on included generic module calls super on included generic module errors when extending generic module that defines instance vars (2) errors when extending generic module that defines instance vars (2) gives error when including instantiation of self, generic module gives error when including instantiation of self, generic module includes generic module with self (check argument superclass type, success) includes generic module with self (check argument superclass type, success) errors if reopening generic module with different splat index (2) errors if reopening generic module with different splat index (2) types proc of module with generic class types proc of module with generic class gives error with cyclic include between non-generic and generic module (2) gives error with cyclic include between non-generic and generic module (2) doesn't look up initialize past module that defines initialize (#7007) doesn't look up initialize past module that defines initialize (#7007) can't pass module class to virtual metaclass (#6113) can't pass module class to virtual metaclass (#6113) includes generic module with self (check return subclass type, success) includes generic module with self (check return subclass type, success) instantiates generic variadic module, accesses T from instance method through generic include instantiates generic variadic module, accesses T from instance method through generic include works with int including enumerable works with int including enumerable can't reopen as struct can't reopen as struct uses :Module name for modules in errors uses :Module name for modules in errors errors if reopening non-generic module as generic errors if reopening non-generic module as generic gives error when including self, generic module gives error when including self, generic module Semantic: ReferenceStorage errors if T is a value type errors if T is a value type allows a different name allows a different name adds ReferenceStorage to Value.subclasses once (#15677) adds ReferenceStorage to Value.subclasses once (#15677) 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 errors if T is a union type errors if T is a union type Visibility modifiers allows invoking protected method from the same class allows invoking protected method from the same class errors if applying visibility modifier to non-def or non-call errors if applying visibility modifier to non-def or non-call defines protected initialize (#7501) defines protected initialize (#7501) allows invoking protected method from subclass allows invoking protected method from subclass gives correct error on unknown call (#2838) gives correct error on unknown call (#2838) allows setting visibility modifier to macro that generates many methods (1) allows setting visibility modifier to macro that generates many methods (1) allows invoking protected from instance to class allows invoking protected from instance to class automatically makes initialize be protected automatically makes initialize be protected 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) allows invoking protected method from virtual type allows invoking protected method from virtual type disallows invoking private method disallows invoking private method errors if invoking protected method from top-level errors if invoking protected method from top-level allows invoking protected method from namespace to namespaced type allows invoking protected method from namespace to namespaced type errors if invoking protected method from non-subclass errors if invoking protected method from non-subclass allows invoking private setter with self allows invoking private setter with self allows calling protected method from nested generic class (1) allows calling protected method from nested generic class (1) handles virtual types (#8561) handles virtual types (#8561) allows calling protected method from nested generic class (2) allows calling protected method from nested generic class (2) allows invoking protected method between types in the same namespace allows invoking protected method between types in the same namespace allows setting visibility modifier to macro allows setting visibility modifier to macro allows invoking protected method from subclass (2) allows invoking protected method from subclass (2) allows invoking protected method from namespaced type to namespace allows invoking protected method from namespaced type to namespace allows invoking protected method between types in the same namespace when inheriting allows invoking protected method between types in the same namespace when inheriting 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 Semantic: NoReturn computes NoReturn in a lazy way inside if then (#314) (2) computes NoReturn in a lazy way inside if then (#314) (2) computes NoReturn in a lazy way inside if else (#314) (3) computes NoReturn in a lazy way inside if else (#314) (3) types call to LibC.exit as NoReturn types call to LibC.exit as NoReturn computes NoReturn in a lazy way inside if then (#314) (1) computes NoReturn in a lazy way inside if then (#314) (1) types union of NoReturns types union of NoReturns computes NoReturn in a lazy way inside if then (#314) (3) computes NoReturn in a lazy way inside if then (#314) (3) computes NoReturn in a lazy way inside if else (#314) (5) computes NoReturn in a lazy way inside if else (#314) (5) 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) assumes if condition's type filters when else is no return assumes if condition's type filters when else is no return types exception handler as NoReturn if ensure is NoReturn types exception handler as NoReturn if ensure is NoReturn computes NoReturn in a lazy way inside if else (#314) (2) computes NoReturn in a lazy way inside if else (#314) (2) types union of NoReturn and something else types union of NoReturn and something else types as NoReturn even if Nil return type is forced (#3096) types as NoReturn even if Nil return type is forced (#3096) types as NoReturn if followed by one-to-many assignment (#15638) types as NoReturn if followed by one-to-many assignment (#15638) computes NoReturn in a lazy way inside if else (#314) (4) computes NoReturn in a lazy way inside if else (#314) (4) types as NoReturn if typeof(exp)'s exp is NoReturn types as NoReturn if typeof(exp)'s exp is NoReturn computes NoReturn in a lazy way inside if then (#314) (5) computes NoReturn in a lazy way inside if then (#314) (5) types raise as NoReturn types raise as NoReturn computes NoReturn in a lazy way inside if then (#314) (4) computes NoReturn in a lazy way inside if then (#314) (4) Codegen: responds_to? works with generic virtual module (2) (#8334) works with generic virtual module (2) (#8334) works with generic virtual superclass (2) works with generic virtual superclass (2) codegens responds_to? with nilable gives false because other type 1 codegens responds_to? with nilable gives false because other type 1 works with virtual type works with virtual type codegens responds_to? with nilable gives false because other type 2 codegens responds_to? with nilable gives false because other type 2 codegens responds_to? true for simple type codegens responds_to? true for simple type works with two virtual types works with two virtual types works with virtual class type (1) (#1926) works with virtual class type (1) (#1926) works with virtual class type (2) (#1926) works with virtual class type (2) (#1926) codegens responds_to? with generic class (1) codegens responds_to? with generic class (1) codegens responds_to? with nilable gives true codegens responds_to? with nilable gives true codegens responds_to? with generic class (2) codegens responds_to? with generic class (2) codegens responds_to? with union gives true codegens responds_to? with union gives true works with generic virtual superclass (1) works with generic virtual superclass (1) does for generic instance type metaclass (#4353) does for generic instance type metaclass (#4353) codegens responds_to? with union gives false codegens responds_to? with union gives false works with module works with module doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) codegens responds_to? false for simple type codegens responds_to? false for simple type works with generic virtual module (1) works with generic virtual module (1) Code gen: magic constants does __FILE__ does __FILE__ does __LINE__ with dispatch does __LINE__ with dispatch does __FILE__ in macro does __FILE__ in macro does __END_LINE__ without block does __END_LINE__ without block does __DIR__ does __DIR__ does __LINE__ when specifying one middle argument does __LINE__ when specifying one middle argument does __LINE__ when specifying one normal default arg does __LINE__ when specifying one normal default arg does __END_LINE__ in macro with block does __END_LINE__ in macro with block does __LINE__ in macro does __LINE__ in macro does __LINE__ when specifying one default arg with __FILE__ does __LINE__ when specifying one default arg with __FILE__ does __END_LINE__ with block does __END_LINE__ with block does __DIR__ in macro does __DIR__ in macro does __END_LINE__ in macro without block does __END_LINE__ in macro without block does __LINE__ does __LINE__ Crystal::ABI::X86_64 size for struct for struct for double for double for array for array for pointer for pointer for packed struct for packed struct for float for float for integer for integer abi_info does with structs larger than 128 bits does with structs larger than 128 bits does with structs less than 64 bits does with structs less than 64 bits does with structs between 64 and 128 bits does with structs between 64 and 128 bits does with primitives does with primitives align for integer for integer for pointer for pointer for double for double for float for float for packed struct for packed struct for struct for struct for array for array Crystal::ABI::X86 align for packed struct for packed struct for integer for integer for double for double for array for array for pointer for pointer for float for float for struct for struct size for integer for integer for struct for struct for float for float for packed struct for packed struct for pointer for pointer for double for double for array for array abi_info does with structs between 64 and 128 bits does with structs between 64 and 128 bits does with structs between 64 and 128 bits does with structs between 64 and 128 bits does with structs less than 64 bits does with structs less than 64 bits does with primitives does with primitives Lexer: location Location.parse raises ArgumentError if column number is invalid raises ArgumentError if column number is invalid raises ArgumentError if missing colon raises ArgumentError if missing colon parses location from string parses location from string raises ArgumentError if missing part raises ArgumentError if missing part raises ArgumentError if line number is invalid raises ArgumentError if line number is invalid stores column numbers stores column numbers uses two consecutive loc pragma uses two consecutive loc pragma parses var/call right after loc (#491) parses var/call right after loc (#491) overrides location with pragma overrides location with pragma locations with virtual files should be comparable locations with virtual files should be comparable locations in same files are comparable based on line locations in same files are comparable based on line stores line numbers stores line numbers pushes and pops its location pushes and pops its location assigns correct loc location to node assigns correct loc location to node locations in different files have no order locations in different files have no order Normalize: proc pointer normalizes proc pointer with ivar receiver normalizes proc pointer with ivar receiver normalizes proc pointer with global const receiver normalizes proc pointer with global const receiver normalizes proc pointer without object normalizes proc pointer without object normalizes proc pointer of global call normalizes proc pointer of global call 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 const receiver normalizes proc pointer with const receiver normalizes proc pointer with variable receiver normalizes proc pointer with variable receiver Semantic: def gives correct error for methods in Class (2) gives correct error for methods in Class (2) gives correct error for methods in Class gives correct error for methods in Class errors if return type doesn't match on class method errors if return type doesn't match on class method uses free variable as block return type uses free variable as block return type reports no overload matches reports no overload matches fixes bug #165 fixes bug #165 types getchar with Char types getchar with Char 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 types call with union argument types call with union argument reports no block given reports no block given accesses free var of default argument (#1101) accesses free var of default argument (#1101) errors when calling two functions with nil type errors when calling two functions with nil type errors if trying to declare method on generic class instance errors if trying to declare method on generic class instance types a call with an argument uses a new scope types a call with an argument uses a new scope can't use self in toplevel method can't use self in toplevel method errors if declares def inside if errors if declares def inside if uses free variable with metaclass and default value uses free variable with metaclass and default value defines class method defines class method types call with global scope types call with global scope defines class method with self defines class method with self says can only defined def on types and self says can only defined def on types and self types a call with an argument types a call with an argument errors when default value is incompatible with non-type restriction errors when default value is incompatible with non-type restriction clones regex literal value (#2384) clones regex literal value (#2384) reports no overload matches 2 reports no overload matches 2 types a call with an argument types a call with an argument uses free variable uses free variable doesn't find type in namespace through free var doesn't find type in namespace through free var points error at name (#6937) points error at name (#6937) 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) assigns def owner assigns def owner errors if return type doesn't match errors if return type doesn't match allows recursion with arg allows recursion with arg 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) types simple recursion types simple recursion calls with default argument calls with default argument reports undefined method reports undefined method types putchar with Char types putchar with Char types empty body def types empty body def reports block given reports block given types a call with a float types a call with a float uses free variable with metaclass uses free variable with metaclass types mutual infinite recursion types mutual infinite recursion do not use body for the def type do not use body for the def type lookups methods in super modules lookups methods in super modules uses free variable and doesn't conflict with top-level type uses free variable and doesn't conflict with top-level type says compile-time type on error says compile-time type on error types a call with an int types a call with an int 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 types mutual recursion types mutual recursion allows recursion allows recursion is ok if returns Int32? with explicit return is ok if returns Int32? with explicit return types simple recursion 2 types simple recursion 2 Semantic: c enum types enum value with base type types enum value with base type allows using an enum as a type in a struct allows using an enum as a type in a struct errors if enum base type is not an integer errors if enum base type is not an integer types enum value types enum value 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 fun allows using an enum as a type in a fun Normalize: hash literal normalizes non-empty with of normalizes non-empty with of hoists complex element expressions, hash-like hoists complex element expressions, hash-like hoists complex element expressions hoists complex element expressions normalizes non-empty without of normalizes non-empty without of hoists complex element expressions, hash-like generic hoists complex element expressions, hash-like generic normalizes empty with of normalizes empty with of evaluates key and value expressions in correct order evaluates key and value expressions in correct order Code gen: def codegens return nil when nilable type (1) codegens return nil when nilable type (1) codegens dispatch without obj, bug 1 codegens dispatch without obj, bug 1 codegens empty def codegens empty def codegens with interesting default argument codegens with interesting default argument dispatches on virtual type implementing generic module (related to bug #165) dispatches on virtual type implementing generic module (related to bug #165) codegens recursive type with union codegens recursive type with union uses previous argument in default value (#1062) uses previous argument in default value (#1062) codegens union to union assignment of mutable arg (#3691) codegens union to union assignment of mutable arg (#3691) call functions defined in any order call functions defined in any order codegens call without args codegens call without args runs empty def runs empty def doesn't crash on private def as last expression doesn't crash on private def as last expression 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 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 call external function 'putchar' call external function 'putchar' codegens dispatch without obj, bug 1 codegens dispatch without obj, bug 1 codegens recursive nasty code codegens recursive nasty code uses self uses self builds infinite recursive function builds infinite recursive function fixes #230: include original owner in mangled def fixes #230: include original owner in mangled def codegens def which changes type of arg codegens def which changes type of arg allows to change argument values allows to change argument values 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 yield with destructing tuple having unreachable element codegens yield with destructing tuple having unreachable element codegens dispatch with single def when discarding unallocated ones (2) codegens dispatch with single def when discarding unallocated ones (2) looks up matches in super classes and merges them with subclasses looks up matches in super classes and merges them with subclasses codegens with related types codegens with related types codegens dispatch on static method codegens dispatch on static method codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens and doesn't break if obj is int and there's a mutation codegens return nil when nilable type (2) codegens return nil when nilable type (2) codegens with and without many default arguments codegens with and without many default arguments codegens with and without default arguments codegens with and without default arguments codegens dispatch with single def when discarding unallocated ones (1) codegens dispatch with single def when discarding unallocated ones (1) 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 uses var after external uses var after external codegens call with args codegens call with args Crystal::Doc::Generator #formatted_doc with alias should generate the Deprecated tag should generate the Deprecated tag with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag with a Deprecated annotation, and 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 Experimental annotation in parameter should generate the Experimental tag should generate the Experimental tag with no annotation, and no docs should generate nothing should generate nothing should generate the full document should generate the full document with a Experimental annotation, and no docs should generate just the Experimental tag should generate just the Experimental tag with alias should generate the Experimental tag should generate the Experimental tag with a Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag with Deprecated annotation in parameter should generate the Deprecated tag should generate the Deprecated tag generates sitemap generates sitemap #collect_constants returns empty array when constants are private returns empty array when constants are private #formatted_summary with a Experimental annotation, and no docs should generate just the Experimental tag should generate just the Experimental tag should generate the first line should generate the first line with a Deprecated annotation, and docs should generate both the docs and Deprecated tag should generate both the docs and Deprecated tag with a Deprecated annotation, and no docs should generate just the Deprecated tag should generate just the Deprecated tag with a Experimental annotation, and docs should generate both the docs and Experimental tag should generate both the docs and Experimental tag should generate the first sentence should generate the first sentence should exclude whitespace before the summary line should exclude whitespace before the summary line with no annotation, and no docs should generate nothing should generate nothing #must_include_toplevel? returns true if program has macro returns true if program has macro returns true if program has method returns true if program has method returns false if program has macro which is defined in other place returns false if program has macro which is defined in other place returns false if program has constant which is defined in other place returns false if program has constant which is defined in other place returns true if program has constant returns true if program has constant returns false if program has nothing returns false if program has nothing returns false if program has method which is defined in other place returns false if program has method which is defined in other place crystal repo inserts pseudo methods inserts pseudo methods Crystal::Repl::Interpreter closures closures self and modifies instance var closures self and modifies instance var does closure and accesses it inside block does closure and accesses it inside block does nested closure inside methods and blocks does nested closure inside methods and blocks does closure inside const does closure inside const does closure inside class variable initializer does closure inside class variable initializer does closure inside block does closure inside block reads self closured struct (#12341) reads self closured struct (#12341) sets ivar of self closured struct (#12341) sets ivar of self closured struct (#12341) closures block args after 8 bytes (the closure var) closures block args after 8 bytes (the closure var) gets ivar of self closured struct (#12341) gets ivar of self closured struct (#12341) does closure inside proc, capture proc argument does closure inside proc, capture proc argument closures self in proc literal closures self in proc literal does nested closure inside proc does nested closure inside proc closures def arguments closures def arguments closures self in proc literal (implicit self) closures self in proc literal (implicit self) does closure without args that captures and modifies two local variables does closure without args that captures and modifies two local variables does closure with pointerof local var does closure with pointerof local var does nested closure inside captured blocks does nested closure inside captured blocks closures closured block arg closures closured block arg does closure without args that captures and modifies one local variable does closure without args that captures and modifies one local variable does closure inside block, capture block arg does closure inside block, capture block arg doesn't mix local vars with closured vars doesn't mix local vars with closured vars does closure inside proc does closure inside proc does closure with two args that captures and modifies two local variables does closure with two args that captures and modifies two local variables does next inside captured block (#12226) does next inside captured block (#12226) closures struct and calls method on it closures struct and calls method on it does closure inside def does closure inside def passes closured struct instance var as self passes closured struct instance var as self .parse_args DIR = . DIR = . NAME DIR NAME DIR DIR (relative to home) DIR (relative to home) DIR with path DIR with path DIR (absolute) DIR (absolute) DIR DIR Crystal::Repl::Interpreter constants returns nil in the assignment returns nil in the assignment interprets self inside constant inside class interprets self inside constant inside class interprets complex constant interprets complex constant hoists constants hoists constants interprets constant literal interprets constant literal magic constants does line number does line number Code gen: struct allows using named arguments for new allows using named arguments for new can access instance var from the outside (#1092) can access instance var from the outside (#1092) automatically converts nil to pointer automatically converts nil to pointer codegens struct property setter codegens struct property setter automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment codegens set struct value with constant codegens set struct value with constant codegens struct property setter via pointer codegens struct property setter via pointer codegens struct access with -> and then . codegens struct access with -> and then . automatically converts numeric union type in struct field assignment automatically converts numeric union type in struct field assignment codegens pointer malloc of struct codegens pointer malloc of struct codegens struct property setter via pointer codegens struct property setter via pointer codegens union inside struct codegens union inside struct passes struct to method (1) passes struct to method (1) passes struct to method (2) passes struct to method (2) can access member of uninitialized struct behind type (#8774) can access member of uninitialized struct behind type (#8774) automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe codegens struct property default value codegens struct property default value codegens struct get inside struct codegens struct get inside struct 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 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 builds struct setter with fun type (1) builds struct setter with fun type (1) builds struct setter with fun type (2) builds struct setter with fun type (2) codegens assign struct to union codegens assign struct to union yields struct via -> yields struct via -> codegens struct set inside struct codegens struct set inside struct codegens passing pointerof(struct) to fun codegens passing pointerof(struct) to fun Code gen: lib casts C fun to Crystal proc when accessing instance var (#2515) casts C fun to Crystal proc when accessing instance var (#2515) can use enum as fun return can use enum as fun return allows invoking out with underscore allows invoking out with underscore doesn't crash with nil and varargs (#4414) doesn't crash with nil and varargs (#4414) allows passing type to LibC if it has a converter with to_unsafe allows passing type to LibC if it has a converter with to_unsafe allows setting/getting external variable as function pointer allows setting/getting external variable as function pointer call to void function call to void function get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) get fun field from union (#672) can use enum as fun argument can use enum as fun argument uses static array in lib extern (#5688) uses static array in lib extern (#5688) refers to lib type (#960) refers to lib type (#960) codegens lib var set and get codegens lib var set and get passes nil to varargs (#1570) passes nil to varargs (#1570) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) get fun field from struct (#672) allows passing type to LibC if it has a converter with to_unsafe (bug) allows passing type to LibC if it has a converter with to_unsafe (bug) doesn't crash when casting -1 to UInt32 (#3594) doesn't crash when casting -1 to UInt32 (#3594) passes int as another float type in literal passes int as another float type in literal can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return can use tuple as fun return Crystal::Repl::Interpreter named tuple interprets named tuple metaclass indexer interprets named tuple metaclass indexer interprets named tuple literal and access by known index interprets named tuple literal and access by known index discards named tuple (#12383) discards named tuple (#12383) Semantic: class var declares uninitialized (#2935) declares uninitialized (#2935) errors if using class variable at the top level errors if using class variable at the top level errors when typing a class variable inside a method errors when typing a class variable inside a method infers type from T.new infers type from T.new types class var inside instance method types class var inside instance method allows self.class as type var in class body (#537) allows self.class as type var in class body (#537) 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 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 (1) errors on undefined constant (1) gives correct error when trying to use Int as a class variable type gives correct error when trying to use Int as a class variable type can access constant from generic metaclass (#3719) can access constant from generic metaclass (#3719) redefines class variable type redefines class variable type infers type from number literal infers type from number literal types as nilable if doesn't have initializer types as nilable if doesn't have initializer doesn't error on recursive dependency if var is nilable (#2943) doesn't error on recursive dependency if var is nilable (#2943) errors if redefining class var type in included module errors if redefining class var type in included module 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) can find class var in subclass can find class var in subclass allows class var in primitive types (#612) allows class var in primitive types (#612) errors when using Class (#2605) errors when using Class (#2605) errors if redefining class var type in subclass, with guess errors if redefining class var type in subclass, with guess errors on undefined constant (2) errors on undefined constant (2) declares class var in generic class declares class var in generic class declares class var in generic module declares class var in generic module 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 types class var inside proc literal inside class types class var inside proc literal inside class says undefined class variable says undefined class variable declares class variable (2) declares class variable (2) 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) can find class var through included module can find class var through included module types class var types class var errors if redefining class var type in subclass errors if redefining class var type in subclass doesn't error if accessing class variable before defined (#2941) doesn't error if accessing class variable before defined (#2941) declares class variable declares class variable Semantic: double splat double splats named argument into arguments (1) double splats named argument into arguments (1) 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) 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 errors missing argument with double splat errors missing argument with double splat uses double splat restriction with concrete type uses double splat restriction with concrete type uses restriction on double splat, doesn't match with empty named tuple uses restriction on double splat, doesn't match with empty named tuple uses double splat restriction uses double splat restriction matches double splat on method with named args matches double splat on method with named args errors if duplicate keys on call side with two double splats errors if duplicate keys on call side with two double splats matches double splat on method (empty) matches double splat on method (empty) uses double splat in new uses double splat in new uses double splat restriction, matches empty uses double splat restriction, matches empty double splats named argument into arguments (2) double splats named argument into arguments (2) overloads based on double splat restriction overloads based on double splat restriction matches double splat on method with named args and regular args matches double splat on method with named args and regular args matches named args producing an empty double splat (#2678) matches named args producing an empty double splat (#2678) uses restriction on double splat, means all types must be that type uses restriction on double splat, means all types must be that type matches double splat with regular splat matches double splat with regular splat Semantic: macro overload doesn't overwrite last macro definition if named args differs doesn't overwrite last macro definition if named args differs Semantic: metaclass can't reopen as struct can't reopen as struct types generic module metaclass types generic module metaclass can't reopen as module can't reopen as module types Object class types Object class types Object and Class metaclasses types Object and Class metaclasses types generic metaclass superclass types generic metaclass superclass types Reference metaclass types Reference metaclass types generic class metaclass types generic class metaclass types generic instance metaclass superclass types generic instance metaclass superclass types Class class types Class class types metaclass superclass types metaclass superclass subtyping relations between metaclasses generic classes (2) generic classes (2) virtual metaclass type with virtual type (#12628) virtual metaclass type with virtual type (#12628) generic modules (1) generic modules (1) generic classes (3) generic classes (3) generic classes (1) generic classes (1) non-generic modules non-generic modules generic modules (3) generic modules (3) generic modules (2) generic modules (2) non-generic classes non-generic classes Code gen: block break from block returns from yielder break from block returns from yielder codegens bug with block and arg and var codegens bug with block and arg and var allows yield from dispatch call allows yield from dispatch call codegens block with nilable type with return (2) codegens block with nilable type with return (2) allows modifying yielded value (with variable) allows modifying yielded value (with variable) codegens block call when argument type changes codegens block call when argument type changes allow return from function called from yielder function allow return from function called from yielder function codegens block bug with conditional next and unconditional break (2) codegens block bug with conditional next and unconditional break (2) union value of yielder function union value of yielder function codegens call with blocks of different type without args codegens call with blocks of different type without args doesn't codegen after while that always yields and breaks doesn't codegen after while that always yields and breaks 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 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 can use instance methods from yielder function can use instance methods from yielder function codegens block with repeated underscore and different types (#4711) codegens block with repeated underscore and different types (#4711) nested yields nested yields codegens block bug with conditional next and unconditional break (4) codegens block bug with conditional next and unconditional break (4) return from yielder function (2) return from yielder function (2) clears nilable var before inlining block method (#10087) clears nilable var before inlining block method (#10087) codegens nested return codegens nested return it yields nil from another call it yields nil from another call allows using var as block arg with outer var allows using var as block arg with outer var passes yield arguments passes yield arguments (bug) doesn't set needs_value to true on every yield (#12442) (bug) doesn't set needs_value to true on every yield (#12442) codegens block with union arg (1) codegens block with union arg (1) does next from captured block does next from captured block unpacks tuple but doesn't override local variables unpacks tuple but doesn't override local variables break with value from yielder that returns a nilable break with value from yielder that returns a nilable codegens block bug with conditional next and unconditional break (3) codegens block bug with conditional next and unconditional break (3) block with nilable type block with nilable type nexts in var assignment (#3364) nexts in var assignment (#3364) pass self to yielder function pass self to yielder function yields splat yields splat 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 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 break from block with value break from block with value return from block that always returns from function that always yields inside if block return from block that always returns from function that always yields inside if block block with nilable type 2 block with nilable type 2 codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) codegens dispatch with block and break (1) assigns yield to argument assigns yield to argument 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 codegens call with block with call with arg that yields codegens call with block with call with arg that yields codegens block with union with return codegens block with union with return 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 codegens block with virtual type arg codegens block with virtual type arg codegens block with multiple underscores (#3054) codegens block with multiple underscores (#3054) uses block splat argument with union types uses block splat argument with union types allows access to local variables allows access to local variables can break without value from yielder that returns nilable (2) can break without value from yielder that returns nilable (2) can set instance vars from yielder function can set instance vars from yielder function can break without value from yielder that returns nilable (1) can break without value from yielder that returns nilable (1) codegens bug with yield not_nil! that is never not nil codegens bug with yield not_nil! that is never not nil codegens method invocation on a object of a captured block with a type that was never instantiated codegens method invocation on a object of a captured block with a type that was never instantiated return from yielder function return from yielder function doesn't codegen call if arg yields and always breaks doesn't codegen call if arg yields and always breaks allows modifying yielded value (with literal) allows modifying yielded value (with literal) generate inline generate inline works if block has both splat and non-splat underscore parameters works if block has both splat and non-splat underscore parameters return from block called from dispatch return from block called from dispatch 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) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) uses block inside array literal (bug) codegens block bug with conditional next and unconditional break (1) codegens block bug with conditional next and unconditional break (1) codegens captured block with next inside yielded block (#2097) codegens captured block with next inside yielded block (#2097) uses block var with same name as local var uses block var with same name as local var codegens if with call with block (ssa issue) codegens if with call with block (ssa issue) codegens block which always breaks but never enters (#494) codegens block which always breaks but never enters (#494) yields more exps than block arg, through splat yields more exps than block arg, through splat doesn't crash if yield exp has no type (#12670) doesn't crash if yield exp has no type (#12670) uses splat in block argument, many args uses splat in block argument, many args codegens nested break codegens nested break codegens while/break inside block codegens while/break inside block return from block return from block auto-unpacks tuple auto-unpacks tuple pass self and arguments to yielder function pass self and arguments to yielder function can access instance vars from yielder function can access instance vars from yielder function returns void when called with block returns void when called with block yields inside yield (#682) yields inside yield (#682) allows initialize with yield (#224) allows initialize with yield (#224) doesn't crash on yield exp without a type (#8100) doesn't crash on yield exp without a type (#8100) 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) return from block that always returns from function that conditionally yields return from block that always returns from function that conditionally yields pass arguments to yielder function pass arguments to yielder function call block from dispatch call block from dispatch break without value returns nil break without value returns nil returns from proc literal returns from proc literal uses splat in block argument uses splat in block argument codegens block with nilable type with return (1) codegens block with nilable type with return (1) executes yield expression if no arg is given for block executes yield expression if no arg is given for block works if block has both splat parameter and multiple non-splat underscore parameters works if block has both splat parameter and multiple non-splat underscore parameters can use self inside a block called from dispatch can use self inside a block called from dispatch codegens block with union arg (2) codegens block with union arg (2) breaks in var assignment (#3364) breaks in var assignment (#3364) codegens block with return and yield and no return codegens block with return and yield and no return dispatches with captured and non-captured block (#3969) dispatches with captured and non-captured block (#3969) can call methods from block when yielder is an instance method can call methods from block when yielder is an instance method breaks from while in function called from block breaks from while in function called from block Code gen: asm codegens with one input codegens with one input codegens with two inputs codegens with two inputs codegens without inputs codegens without inputs codegens with two outputs codegens with two outputs passes correct string length to LLVM passes correct string length to LLVM codegens with intel dialect codegens with intel dialect Normalize: regex literal StringInterpolation simple simple options empty empty x x imx imx im im i i StringLiteral simple simple expands to const expands to const 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 upcasts from non-generic to generic upcasts from non-generic to generic casts to base class making it virtual casts to base class making it virtual casts with block var that changes type (#3341) casts with block var that changes type (#3341) 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 from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from union to single type raises TypeCastError casts from 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 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 cast virtual metaclass type to nilable virtual instance type (#12628) cast virtual metaclass type to nilable virtual instance type (#12628) can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from pointer to pointer casts from 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 allows casting nil to Void* allows casting nil to Void* allows casting object to pointer and back allows casting object to pointer and back upcasts type to virtual (#3304) upcasts type to virtual (#3304) 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 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 to bigger union casts to bigger union casts between union types, where union has a tuple type (#3377) casts between union types, where union has a tuple type (#3377) can cast to metaclass (#11121) can cast to metaclass (#11121) 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 nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) casts from nilable type to virtual type (#3512) allows casting nilable type to Void* (3) allows casting nilable type to Void* (3) 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* (2) allows casting nilable type to Void* (2) casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from nilable to nil raises TypeCastError casts from 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 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 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) upcasts type to virtual (2) (#3304) upcasts type to virtual (2) (#3304) casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError casts from virtual to single type raises TypeCastError upcasts 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* (1) allows casting nilable type to Void* (1) Semantic: yield with scope errors if using instance variable at top level errors if using instance variable at top level infer type of block body with yield scope infer type of block body with yield scope invokes nested calls invokes nested calls mentions with yield scope and current scope in error mentions with yield scope and current scope in error infer type of block body infer type of block body infer type of empty block body infer type of empty block body uses method of enclosing scope uses method of enclosing scope finds macro finds macro infer type of block body with yield scope and arguments infer type of block body with yield scope and arguments uses instance variable of enclosing scope uses instance variable of enclosing scope passes #229 passes #229 Crystal::ABI::X86_Win64 abi_info does with packed struct not containing unaligned fields does with packed struct not containing unaligned fields does with structs between 64 and 128 bits does with structs between 64 and 128 bits does with packed struct containing unaligned fields (#9873) does with packed struct containing unaligned fields (#9873) does with structs larger than 128 bits does with structs larger than 128 bits Parser warnings warns on missing space before colon in anonymous block param type restriction in anonymous block param type restriction in return type restriction in return type restriction in block param type restriction in block param type restriction in type declaration in type declaration warns on suffix-less UInt64 literals > Int64::MAX warns on suffix-less UInt64 literals > Int64::MAX Code gen: enum can use macro calls inside enum value (#424) can use macro calls inside enum value (#424) codegens enum bitflags (2) codegens enum bitflags (2) codegens enum bitflags None codegens enum bitflags None automatically defines question method for each enum member (true case) automatically defines question method for each enum member (true case) codegens enum bitflags (1) codegens enum bitflags (1) automatically defines question method for each enum member (flags, true case) automatically defines question method for each enum member (flags, 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 None redefined codegens enum None redefined does ~ at compile time for enum member does ~ at compile time for enum member codegens enum codegens enum uses enum value before declaration (hoisting) uses enum value before declaration (hoisting) automatically defines question method for each enum member (false case) automatically defines question method for each enum member (false case) codegens enum All redefined codegens enum All redefined can use macro calls inside enum value, macro defined outside enum (#424) can use macro calls inside enum value, macro defined outside enum (#424) can define flags enum : UInt64 with more than 32 values (#7268) can define flags enum : UInt64 with more than 32 values (#7268) casts All value to base type casts All value to base type codegens enum without explicit value codegens enum without explicit value can define flags enum : UInt128 with compile-time interpreted values can define flags enum : UInt128 with compile-time interpreted values creates enum from value creates enum from value can redefine Enum.new and use previous_def can redefine Enum.new and use previous_def can use macro calls inside enum value, with receiver (#424) can use macro calls inside enum value, with receiver (#424) codegens enum bitflags (4) codegens enum bitflags (4) codegens enum bitflags All codegens enum bitflags All codegens enum value codegens enum value can define flags enum : UInt128 with 128 values can define flags enum : UInt128 with 128 values allows class vars in enum allows class vars in enum adds a none? method to flags enum adds a none? method to flags enum Code gen: union type assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union assigns union to union codegens union type when no obj codegens union type when no obj codegens union type when obj is union and no args codegens union type when obj is union and no args codegens union type when obj union but arg is not codegens union type when obj union but arg is not respects union payload alignment when upcasting Bool (#14898) respects union payload alignment when upcasting Bool (#14898) 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 and restrictions codegens union type when no obj and restrictions 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 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 if with same nested union codegens if with same nested union codegens union type as return value codegens union type as return value sorts restrictions when there are unions sorts restrictions when there are unions 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 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 arg is union codegens union type when obj is union and arg is union codegens union type for instance var codegens union type for instance var Crystal::Repl can return static and runtime type information for UnionType UnionType Non Union Non Union VirtualType VirtualType MixedUnionType MixedUnionType can parse and evaluate snippets can parse and evaluate snippets Crystal::TablePrint colspan a cell that fits the available size colspan a cell that fits the available size single cell single cell multiple rows with separator multiple rows with separator aligns cell content aligns cell content single row with separator single row with separator rows with horizontal separators rows with horizontal separators aligns columns borders aligns columns borders Code gen: C ABI passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) passes struct bigger than 128 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) returns struct less than 64 bits (for real) promotes variadic args (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 when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) passes struct after many other args when returning a large struct (sret return type) returns struct 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 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) 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) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (i8 to i32) (#9742) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (float to double) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) promotes variadic args (u16 to i32) (#9742) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) passes struct after many other args (for real) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) promotes variadic args (u8 to i32) (#9742) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct less than 64 bits (for real) passes struct 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) Semantic: external/internal can call positionally can call positionally macros 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 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 can call with external name and use with internal overloads based on external name (#2610) overloads based on external name (#2610) can call with external name and use with internal, after splat can call with external name and use with internal, after splat Normalize: def expands with two named argument expands with two named argument expands def with reserved external name (#6559) expands def with reserved external name (#6559) expands with one named arg that is the only one (2) expands with one named arg that is the only one (2) expands with magic constant with named arg expands with magic constant with named arg expands a def on request with default arguments (external names) expands a def on request with default arguments (external names) expands with two named argument and one not expands with two named argument and one not expands a def with double splat and no args expands a def with double splat and no args uses bare * uses bare * expands with magic constant expands with magic constant expands arg with default value after splat expands arg with default value after splat expands with splat with one arg before expands with splat with one arg before expands a def with double splat and two named args and regular args expands a def with double splat and two named args and regular args expands with splat and default argument expands with splat and default argument expands a def on request with default arguments that yields (2) expands a def on request with default arguments that yields (2) expands a def with splat and double splat expands a def with splat and double splat expands with more named arg which come in the correct order expands with more named arg which come in the correct order expands a def on request with default arguments (2) expands a def on request with default arguments (2) expands with named argument and yield expands with named argument and yield expands a def on request with default arguments expands a def on request with default arguments expands with magic constant specifying one when all are magic expands with magic constant specifying one when all are magic gives correct body location with default arg with restriction, without body default arg with restriction, without body default arg with restriction, with body default arg with restriction, with body default arg, with body default arg, with body block instance var arg, without body block instance var arg, without body splat arg, without body splat arg, without body block instance var arg, with body block instance var arg, with body splat arg, with body splat arg, with body default arg, without body default arg, without body expands with magic constant specifying one when not all are magic expands with magic constant specifying one when not all are magic expands a def on request with default arguments and type restrictions (2) expands a def on request with default arguments and type restrictions (2) expands a def with external names (2) expands a def with external names (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 splat expands with splat expands with splat and zero expands with splat and zero expands a def with double splat and two named args expands a def with double splat and two named args expands with named argument expands with named argument expands a def with external names (1) expands a def with external names (1) expands a def on request with default arguments and type restrictions expands a def on request with default arguments and type restrictions expands with 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 expands a def on request with default arguments that yields expands default value after splat index expands default value after splat index expands a new def with double splat and two named args and regular args expands a new def with double splat and two named args and regular args expands a def on request with default arguments that yields (external names) expands a def on request with default arguments that yields (external names) Normalize: string interpolation normalizes string interpolation normalizes string interpolation replaces string constant replaces string constant replaces through multiple levels replaces through multiple levels normalizes heredoc normalizes heredoc normalizes string interpolation with multiple lines normalizes string interpolation with multiple lines replaces string constant that results from macro expansion replaces string constant that results from macro expansion Semantic: pointer types pointer diff types pointer diff can't do Pointer.malloc without type var can't do Pointer.malloc without type var errors with non-matching generic value with value= (#10211) errors with non-matching generic value with value= (#10211) allows using pointer with subclass allows using pointer with subclass detects recursive pointerof expansion (#551) (#553) detects recursive pointerof expansion (#551) (#553) errors if doing Pointer.allocate errors if doing Pointer.allocate types Pointer.malloc types Pointer.malloc pointer of class raises error pointer of class raises error create pointer by address create pointer by address detects recursive pointerof expansion (3) detects recursive pointerof expansion (3) can assign pointerof virtual type (#8216) can assign pointerof virtual type (#8216) says undefined variable (#7556) says undefined variable (#7556) detects recursive pointerof expansion (4) detects recursive pointerof expansion (4) can pass any pointer to something expecting void* in lib call can pass any pointer to something expecting void* in lib call types int pointer types int pointer can assign nil to void pointer can assign nil to void pointer takes pointerof lib external var takes pointerof lib external var type pointer casting type pointer casting detects recursive pointerof expansion (2) (#1654) detects recursive pointerof expansion (2) (#1654) types realloc types realloc pointer of class raises error pointer of class raises error 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 with non-matching generic value with value=, generic type (#10211) errors with non-matching generic value with value=, generic type (#10211) pointer malloc creates new type pointer malloc creates new type type pointer casting of object type type pointer casting of object type types pointer of constant types pointer of constant doesn't crash if pointerof expansion type has generic splat parameter (#11808) doesn't crash if pointerof expansion type has generic splat parameter (#11808) does not recalculate element type on multiple calls to `#value=` (#15742) does not recalculate element type on multiple calls to `#value=` (#15742) types pointer value on typedef types pointer value on typedef pointer of value error pointer of value error types pointer value types pointer value can pass any pointer to something expecting void* in lib call, with to_unsafe can pass any pointer to something expecting void* in lib call, with to_unsafe types pointer add types pointer add cleanup 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 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 Crystal::Doc::Generator :nodoc: hides documentation from being generated for methods hides documentation from being generated for methods hides documentation from being generated for classes hides documentation from being generated for classes :showdoc: shows documentation for private methods shows documentation for private methods does not include documentation for methods within a :nodoc: namespace does not include documentation for methods within a :nodoc: namespace doesn't show a method marked :nodoc: within a :showdoc: namespace doesn't show a method marked :nodoc: within a :showdoc: namespace does not include documentation for private and protected methods and objects in a :showdoc: namespace does not include documentation for private and protected methods and objects in a :showdoc: namespace does not include documentation for a :showdoc: fun inside a lib not marked with :showdoc: does not include documentation for a :showdoc: fun inside a lib not marked with :showdoc: doesn't show a fun marked :nodoc: within a :showdoc: lib doesn't show a fun marked :nodoc: within a :showdoc: lib shows documentation for nested objects if a lib is marked with :showdoc: shows documentation for nested objects if a lib is marked with :showdoc: Semantic: named args errors if missing two arguments errors if missing two arguments errors if doesn't pass named arg restriction errors if doesn't pass named arg restriction errors if named arg already specified, but multiple overloads (#7281) errors if named arg already specified, but multiple overloads (#7281) says no overload matches with named arg says no overload matches with named arg matches specific overload with named arguments (#2753) matches specific overload with named arguments (#2753) gives correct error message for missing args after * gives correct error message for missing args after * sends two regular arguments as named arguments in inverted position (1) sends two regular arguments as named arguments in inverted position (1) errors if missing one argument errors if missing one argument errors if named arg not found errors if named arg not found errors if named arg already specified errors if named arg already specified errors if named arg already specified errors if named arg already specified 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 (2) (#2753) matches specific overload with named arguments (2) (#2753) errors if named arg matches single splat argument errors if named arg matches single splat argument overloads based on required named args overloads based on required named args allows named arg if there's a splat allows named arg if there's a splat sends two regular arguments as named arguments in inverted position (2) sends two regular arguments as named arguments in inverted position (2) gives correct error message with external names (#3934) gives correct error message with external names (#3934) overloads based on required named args, with restrictions overloads based on required named args, with restrictions errors if named arg not found in new errors if named arg not found in new doesn't fail on named argument with NoReturn type (#7760) doesn't fail on named argument with NoReturn type (#7760) uses bare splat in new uses bare splat in new sends one regular argument as named argument sends one regular argument as named argument errors if named arg already specified but in same position errors if named arg already specified but in same position passes #2696 passes #2696 says correct error when forwarding named args (#7491) says correct error when forwarding named args (#7491) sends two regular arguments as named arguments sends two regular arguments as named arguments errors if named arg matches splat argument errors if named arg matches splat argument Crystal::Repl::Interpreter bugs does multidispatch on virtual struct union nil does multidispatch on virtual struct union nil doesn't override local variable value with block var with the same name doesn't override local variable value with block var with the same name doesn't pass self to top-level method (FileNode) doesn't pass self to top-level method (FileNode) does leading zeros does leading zeros correctly puts virtual metaclass type in union correctly puts virtual metaclass type in union doesn't incorrectly consider a non-closure as closure doesn't incorrectly consider a non-closure as closure does multidispatch on virtual struct does multidispatch on virtual struct breaks from current block, not from outer block breaks from current block, not from outer block doesn't pass self to top-level method doesn't pass self to top-level method semantic: case checks exhaustiveness for tuple literal, with call checks exhaustiveness for tuple literal, with call checks exhaustiveness of nilable type with nil literal checks exhaustiveness of nilable type with nil literal checks exhaustiveness of bool type (missing true) checks exhaustiveness of bool type (missing true) doesn't check exhaustiveness when using 'when' doesn't check exhaustiveness when using 'when' 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, 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 checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal with bool and underscore at second position, with partial match checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness for tuple literal, and passes checks exhaustiveness for tuple literal, and passes checks exhaustiveness of enum via const checks exhaustiveness of enum via const checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness of enum through method (all cases covered) checks exhaustiveness of enum (all cases covered) checks exhaustiveness of enum (all cases covered) checks exhaustiveness of enum via question method checks exhaustiveness of enum via question method checks exhaustiveness for tuple literal with bool and underscore at second position, partial match checks exhaustiveness for tuple literal with bool and underscore at second position, partial match checks exhaustiveness of single type (generic) checks exhaustiveness of single type (generic) checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness for tuple literal of 3 elements, all enums checks exhaustiveness of nil type with nil literal checks exhaustiveness of nil type with nil literal errors if casing against a constant errors if casing against a constant checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness, covers in base type covers (generic type) checks exhaustiveness of union with bool checks exhaustiveness of union with bool 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 checks exhaustiveness of single type checks exhaustiveness of bool type (missing false) checks exhaustiveness of bool type (missing false) checks exhaustiveness for tuple literal with types and underscore at first position checks exhaustiveness for tuple literal with types and underscore at first position checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match checks exhaustiveness for tuple literal with bool and underscore at first position, with partial match checks exhaustiveness of bool type with other types checks exhaustiveness of bool type with other types checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness of single type (Foo(T).class) checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness for tuple literal of 3 elements, all bool checks exhaustiveness of enum combined with another type checks exhaustiveness of enum combined with another type checks exhaustiveness of single type (T.class) checks exhaustiveness of single type (T.class) checks exhaustiveness of union type with virtual type checks exhaustiveness of union type with virtual type checks exhaustiveness for tuple literal of 3 elements, and warns checks exhaustiveness for tuple literal of 3 elements, and warns can't prove case is exhaustive for @[Flags] enum, tuple case can't prove case is exhaustive for @[Flags] enum, tuple case checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness for tuple literal with bool and underscore at first position, partial match checks exhaustiveness for tuple literal of 2 elements, and warns checks exhaustiveness for tuple literal of 2 elements, and warns covers all types covers all types checks exhaustiveness for tuple literal of 2 elements, first is bool checks exhaustiveness for tuple literal of 2 elements, first is bool 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 checks exhaustiveness for tuple literal with bool and underscore at second position checks exhaustiveness, covers in base type covers checks exhaustiveness, covers in base type covers Semantic: while types while with assignment types while with assignment finds all while cond assign targets in expressions (#10350) finds all while cond assign targets in expressions (#10350) finds all while cond assign targets in expressions (3) finds all while cond assign targets in expressions (3) types while with multiple breaks with value types while with multiple breaks with value types while with && (#1425) types while with && (#1425) types while (true) as NoReturn types while (true) as NoReturn doesn't restrict type after while if there's a break (#4242) doesn't restrict type after while if there's a break (#4242) types while with assignment and && types while with assignment and && doesn't fail on Expressions condition (2) doesn't fail on Expressions condition (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) restricts type after `while` with `not` and `and` (#4242) restricts type after `while` with `not` and `and` (#4242) marks variable as nil if breaking before assigning to it in an endless loop (2) marks variable as nil if breaking before assigning to it in an endless loop (2) types while with break with value types while with break with value 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) finds while cond assign target in Not (#10345) finds while cond assign target in Not (#10345) types endless while with break with value types endless while with break with value types while types while types endless while with break without value types endless while with break without value uses var type inside while if endless loop uses var type inside while if endless loop doesn't fail on nested conditionals inside typeof condition doesn't fail on nested conditionals inside typeof condition uses type at end of endless while if variable is reassigned, but not before first break (2) uses type at end of endless while if variable is reassigned, but not before first break (2) rebinds condition variable after while body (#6158) rebinds condition variable after while body (#6158) finds all while cond assign targets in expressions (6) finds all while cond assign targets in expressions (6) restricts type after while with not (#4242) restricts type after while with not (#4242) types while true as NoReturn types while true as NoReturn doesn't type var as nilable after break inside rescue doesn't type var as nilable after break inside rescue doesn't fail on new variables inside typeof condition doesn't fail on new variables inside typeof condition doesn't fail on Expressions condition (1) doesn't fail on Expressions condition (1) doesn't modify variables unchanged in condition and body doesn't modify variables unchanged in condition and body 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 finds all while cond assign targets in expressions (2) finds all while cond assign targets in expressions (2) reports break cannot be used outside a while reports break cannot be used outside a while types while with assignment and call types while with assignment and call 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 finds all while cond assign targets in expressions (4) finds all while cond assign targets in expressions (4) 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 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 types while with break without value types while with break without value restricts type after while (#4242) restricts type after while (#4242) reports next cannot be used outside a while reports next cannot be used outside a while uses var type inside while if endless loop (2) uses var type inside while if endless loop (2) types variable as nilable if raise before assign types variable as nilable if raise before assign finds all while cond assign targets in expressions (5) finds all while cond assign targets in expressions (5) Crystal::Doc::Macro args_to_s shows external name of arg shows external name of arg shows default value with highlighting shows default value with highlighting shows splat arg shows splat arg shows simple arg and double splat arg shows simple arg and double splat arg shows simple arg and block arg shows simple arg and block arg shows simple args shows simple args shows block arg shows block arg shows double splat arg shows double splat arg shows simple arg and splat arg shows simple arg and splat arg shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows double splat arg shows double splat arg Semantic: splat uses splat restriction uses splat restriction uses bare *, doesn't let more args uses bare *, doesn't let more args overloads with type restriction and splat (7) overloads with type restriction and splat (7) 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 doesn't match free var type splats inside explicit Union doesn't match free var type splats inside explicit Union matches with type var and splat of itself inside explicit Union matches with type var and splat of itself inside explicit Union doesn't shift a call's location doesn't shift a call's location 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, matches empty uses splat restriction, matches empty overloads with type restriction and splat (3) overloads with type restriction and splat (3) 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 Crystal::Splat with splat with splat without splat without splat says no overload matches on type restrictions past the splat arg says no overload matches on type restrictions past the splat arg errors if using two splat indices on restriction errors if using two splat indices on restriction uses splat restriction after non-splat arguments (#5037) uses splat restriction after non-splat arguments (#5037) overloads with splat against method with two arguments (#986) (1) overloads with splat against method with two arguments (#986) (1) 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 matches partially instantiated generic with splat in generic type matches partially 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) uses splat restriction with concrete type uses splat restriction with concrete type uses bare * uses bare * gives correct error when forwarding splat (2) gives correct error when forwarding splat (2) splats arg and splat against splat (1) (#1042) splats arg and splat against splat (1) (#1042) doesn't match splat in generic type with unsplatted tuple (#10164) doesn't match splat in generic type with unsplatted tuple (#10164) says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat doesn't crash on non-match (#2521) doesn't crash on non-match (#2521) calls super with implicit splat arg (#1001) calls super with implicit splat arg (#1001) errors with too few non-splat type arguments (1) errors with too few non-splat type arguments (1) splats arg and splat against splat (2) (#1042) splats arg and splat against splat (2) (#1042) method with splat and optional named argument matches zero args call (#2746) method with splat and optional named argument matches zero args call (#2746) errors with too many non-splat type arguments errors with too many non-splat type arguments errors if doesn't match splat with type restriction errors if doesn't match splat with type restriction overloads with type restriction and splat (6) overloads with type restriction and splat (6) forwards tuple with an extra argument forwards tuple with an extra argument overloads with type restriction and splat (4) overloads with type restriction and splat (4) overloads with type restriction and splat (5) overloads with type restriction and splat (5) errors if splatting union errors if splatting union method with default arguments and splat matches call with one arg (#2766) method with default arguments and splat matches call with one arg (#2766) matches with type var splat inside explicit Union matches with type var splat inside explicit Union matches type splat with splat in generic type (2) matches type splat with splat in generic type (2) matches with type var and splat of itself inside explicit Union (3) matches with type var and splat of itself inside explicit Union (3) matches with splat matches with splat matches with tuple splat inside explicit Union matches with tuple splat inside explicit Union forwards tuple in return statement forwards tuple in return statement overloads with type restriction and splat (1) overloads with type restriction and splat (1) errors if splatting non-tuple type in return values errors if splatting non-tuple type in return values can splat after type filter left it as a tuple (#442) can splat after type filter left it as a tuple (#442) accesses T when empty, via module accesses T when empty, via module errors with too few non-splat type arguments (2) errors with too few non-splat type arguments (2) gives correct error when forwarding splat gives correct error when forwarding splat errors if splatting non-tuple type in call arguments errors if splatting non-tuple type in call arguments matches with type var splat inside explicit Union (2) matches with type var splat inside explicit Union (2) overloads with type restriction and splat (2) overloads with type restriction and splat (2) matches with type var and splat of itself inside explicit Union (2) matches with type var and splat of itself inside explicit Union (2) splats splats works if matches splat with type restriction works if matches splat with type restriction matches instantiated generic with splat in generic type matches instantiated generic with splat in generic type overloads with splat against method with two arguments (#986) (2) overloads with splat against method with two arguments (#986) (2) allows default value after splat index allows default value after splat index errors on zero args with named arg and splat errors on zero args with named arg and splat redefines method with splat (bug #248) redefines method with splat (bug #248) Crystal::Repl::Interpreter conversion interprets Int32::MAX#to_u32! interprets Int32::MAX#to_u32! interprets UInt32::MAX#to_i32! interprets UInt32::MAX#to_i32! interprets UInt64::MAX#to_i32! interprets UInt64::MAX#to_i32! interprets Int16::MIN#to_u! interprets Int16::MIN#to_u! interprets UInt16::MAX#to_f32! interprets UInt16::MAX#to_f32! interprets Int16::MAX#to_i64! interprets Int16::MAX#to_i64! interprets Float32#to_u64! (positive) interprets Float32#to_u64! (positive) interprets Float32#to_i! (negative) interprets Float32#to_i! (negative) interprets Int32::MIN#to_u! interprets Int32::MIN#to_u! interprets Int8::MIN#to_i16! interprets Int8::MIN#to_i16! interprets Int64::MIN#to_u16! interprets Int64::MIN#to_u16! interprets Int8::MAX#to_i16! interprets Int8::MAX#to_i16! interprets Int8::MIN#to_i! interprets Int8::MIN#to_i! interprets UInt16::MAX#to_u64! interprets UInt16::MAX#to_u64! interprets Int64::MAX#to_i16! interprets Int64::MAX#to_i16! interprets Int32::MAX#to_i64! interprets Int32::MAX#to_i64! interprets Float64#to_i64! (positive) interprets Float64#to_i64! (positive) interprets Int32::MIN#to_f64! interprets Int32::MIN#to_f64! interprets Float32#to_f64! (positive) interprets Float32#to_f64! (positive) interprets Int8::MIN#to_f32! interprets Int8::MIN#to_f32! interprets Int64::MAX#to_u32! interprets Int64::MAX#to_u32! interprets Int16::MAX#to_i16! interprets Int16::MAX#to_i16! interprets Int8::MIN#to_f64! interprets Int8::MIN#to_f64! interprets Int8::MAX#to_i! interprets Int8::MAX#to_i! interprets Int16::MAX#to_u8! interprets Int16::MAX#to_u8! interprets UInt32::MAX#to_u! interprets UInt32::MAX#to_u! interprets UInt16::MAX#to_i32! interprets UInt16::MAX#to_i32! interprets UInt8::MAX#to_i32! interprets UInt8::MAX#to_i32! interprets UInt16::MAX#to_u16! interprets UInt16::MAX#to_u16! interprets Float32#to_f32! (positive) interprets Float32#to_f32! (positive) interprets Int16::MAX#to_u16! interprets Int16::MAX#to_u16! interprets Int64::MIN#to_i32! interprets Int64::MIN#to_i32! interprets Int16::MIN#to_i32! interprets Int16::MIN#to_i32! interprets UInt16::MAX#to_i64! interprets UInt16::MAX#to_i64! interprets Float64#to_i64! (negative) interprets Float64#to_i64! (negative) interprets UInt32::MAX#to_f64! interprets UInt32::MAX#to_f64! interprets UInt8::MAX#to_u64! interprets UInt8::MAX#to_u64! interprets Float64#to_f32! (positive) interprets Float64#to_f32! (positive) interprets UInt16::MAX#to_i8! interprets UInt16::MAX#to_i8! interprets UInt8::MAX#to_i64! interprets UInt8::MAX#to_i64! interprets Int32::MAX#to_u64! interprets Int32::MAX#to_u64! interprets Int32::MIN#to_u8! interprets Int32::MIN#to_u8! interprets Int64::MAX#to_u8! interprets Int64::MAX#to_u8! interprets Float64#to_i8! (negative) interprets Float64#to_i8! (negative) interprets UInt8::MAX#to_u16! interprets UInt8::MAX#to_u16! interprets UInt64::MAX#to_f64! interprets UInt64::MAX#to_f64! interprets Int16::MIN#to_i8! interprets Int16::MIN#to_i8! interprets Int8::MIN#to_u32! interprets Int8::MIN#to_u32! interprets UInt8::MAX#to_i! interprets UInt8::MAX#to_i! discards conversion discards conversion interprets Int32::MIN#to_u32! interprets Int32::MIN#to_u32! interprets Int64::MIN#to_i! interprets Int64::MIN#to_i! interprets Int64::MIN#to_u64! interprets Int64::MIN#to_u64! interprets Int64::MAX#to_u! interprets Int64::MAX#to_u! interprets Int32::MAX#to_f64! interprets Int32::MAX#to_f64! interprets Float64#to_u8! (positive) interprets Float64#to_u8! (positive) interprets UInt16::MAX#to_i16! interprets UInt16::MAX#to_i16! interprets UInt64::MAX#to_i8! interprets UInt64::MAX#to_i8! interprets Float32#to_i8! (negative) interprets Float32#to_i8! (negative) interprets Float64#to_i32! (positive) interprets Float64#to_i32! (positive) interprets Int64::MIN#to_i64! interprets Int64::MIN#to_i64! interprets Int32::MAX#to_u8! interprets Int32::MAX#to_u8! interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_f32! interprets UInt8::MAX#to_u32! interprets UInt8::MAX#to_u32! interprets Int8::MIN#to_u8! interprets Int8::MIN#to_u8! interprets Int8::MAX#to_i32! interprets Int8::MAX#to_i32! interprets Int16::MAX#to_u32! interprets Int16::MAX#to_u32! interprets Int32::MAX#to_i! interprets Int32::MAX#to_i! interprets UInt64::MAX#to_u64! interprets UInt64::MAX#to_u64! interprets Float32#to_u16! (positive) interprets Float32#to_u16! (positive) interprets Float32#to_i16! (negative) interprets Float32#to_i16! (negative) interprets Float64#to_i8! (positive) interprets Float64#to_i8! (positive) interprets UInt64::MAX#to_u! interprets UInt64::MAX#to_u! interprets Int32::MIN#to_i64! interprets Int32::MIN#to_i64! interprets Int64::MAX#to_f32! interprets Int64::MAX#to_f32! interprets Int32::MIN#to_i8! interprets Int32::MIN#to_i8! interprets Int64::MAX#to_u64! interprets Int64::MAX#to_u64! interprets Float32#to_f32! (negative) interprets Float32#to_f32! (negative) interprets Int8::MIN#to_i8! interprets Int8::MIN#to_i8! interprets UInt8::MAX#to_i8! interprets UInt8::MAX#to_i8! interprets Int8::MIN#to_i64! interprets Int8::MIN#to_i64! interprets UInt64::MAX#to_u8! interprets UInt64::MAX#to_u8! interprets UInt32::MAX#to_i64! interprets UInt32::MAX#to_i64! interprets Float32#to_i32! (negative) interprets Float32#to_i32! (negative) discards conversion with local var discards conversion with local var interprets Int8::MAX#to_u32! interprets Int8::MAX#to_u32! interprets Int32::MIN#to_i16! interprets Int32::MIN#to_i16! Int32#unsafe_chr Int32#unsafe_chr interprets UInt64::MAX#to_i16! interprets UInt64::MAX#to_i16! interprets Float64#to_u16! (positive) interprets Float64#to_u16! (positive) interprets Int32::MIN#to_i! interprets Int32::MIN#to_i! interprets UInt16::MAX#to_u32! interprets UInt16::MAX#to_u32! interprets UInt32::MAX#to_i16! interprets UInt32::MAX#to_i16! interprets Float64#to_f64! (positive) interprets Float64#to_f64! (positive) interprets Int16::MIN#to_u32! interprets Int16::MIN#to_u32! interprets Int16::MIN#to_f32! interprets Int16::MIN#to_f32! interprets Float64#to_i! (negative) interprets Float64#to_i! (negative) interprets Float32#to_i16! (positive) interprets Float32#to_i16! (positive) interprets Int16::MAX#to_u64! interprets Int16::MAX#to_u64! interprets Int16::MIN#to_u8! interprets Int16::MIN#to_u8! interprets Float32#to_i! (positive) interprets Float32#to_i! (positive) interprets Int64::MAX#to_u16! interprets Int64::MAX#to_u16! interprets Float64#to_i16! (negative) interprets Float64#to_i16! (negative) interprets Int64::MIN#to_u! interprets Int64::MIN#to_u! interprets UInt16::MAX#to_i! interprets UInt16::MAX#to_i! interprets Int32::MAX#to_i16! interprets Int32::MAX#to_i16! interprets Int64::MAX#to_f64! interprets Int64::MAX#to_f64! interprets Float64#to_u64! (positive) interprets Float64#to_u64! (positive) interprets Int8::MAX#to_f64! interprets Int8::MAX#to_f64! interprets Int8::MAX#to_f32! interprets Int8::MAX#to_f32! interprets Int32::MIN#to_u16! interprets Int32::MIN#to_u16! interprets Int64::MAX#to_i8! interprets Int64::MAX#to_i8! interprets UInt16::MAX#to_u8! interprets UInt16::MAX#to_u8! interprets Int16::MAX#to_f64! interprets Int16::MAX#to_f64! interprets Float32#to_u! (positive) interprets Float32#to_u! (positive) interprets Int16::MIN#to_f64! interprets Int16::MIN#to_f64! interprets Float32#to_u8! (positive) interprets Float32#to_u8! (positive) interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u16! interprets Int8::MAX#to_u! interprets Int8::MAX#to_u! interprets Int32::MIN#to_i32! interprets Int32::MIN#to_i32! interprets Int64::MIN#to_i16! interprets Int64::MIN#to_i16! interprets Int16::MAX#to_f32! interprets Int16::MAX#to_f32! interprets UInt8::MAX#to_u8! interprets UInt8::MAX#to_u8! interprets UInt64::MAX#to_f32! interprets UInt64::MAX#to_f32! interprets Int32::MAX#to_u16! interprets Int32::MAX#to_u16! interprets Int32::MAX#to_f32! interprets Int32::MAX#to_f32! interprets Int16::MAX#to_i8! interprets Int16::MAX#to_i8! interprets Int16::MIN#to_i! interprets Int16::MIN#to_i! interprets Int64::MIN#to_u8! interprets Int64::MIN#to_u8! interprets Int8::MAX#to_i64! interprets Int8::MAX#to_i64! interprets Float32#to_i64! (negative) interprets Float32#to_i64! (negative) interprets Float32#to_u32! (positive) interprets Float32#to_u32! (positive) interprets UInt32::MAX#to_u8! interprets UInt32::MAX#to_u8! interprets UInt32::MAX#to_u64! interprets UInt32::MAX#to_u64! UInt8#unsafe_chr UInt8#unsafe_chr interprets Int8::MAX#to_u8! interprets Int8::MAX#to_u8! interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u16! interprets UInt32::MAX#to_u32! interprets UInt32::MAX#to_u32! interprets Int16::MIN#to_i16! interprets Int16::MIN#to_i16! interprets Int64::MAX#to_i32! interprets Int64::MAX#to_i32! interprets Int8::MIN#to_u! interprets Int8::MIN#to_u! interprets Float32#to_i32! (positive) interprets Float32#to_i32! (positive) interprets Float64#to_u! (positive) interprets Float64#to_u! (positive) interprets UInt64::MAX#to_i! interprets UInt64::MAX#to_i! interprets Int32::MIN#to_u64! interprets Int32::MIN#to_u64! interprets Float32#to_i64! (positive) interprets Float32#to_i64! (positive) interprets Int8::MIN#to_u64! interprets Int8::MIN#to_u64! interprets UInt64::MAX#to_u16! interprets UInt64::MAX#to_u16! interprets Float32#to_f64! (negative) interprets Float32#to_f64! (negative) interprets Int64::MIN#to_f32! interprets Int64::MIN#to_f32! interprets Int64::MIN#to_f64! interprets Int64::MIN#to_f64! interprets UInt8::MAX#to_f64! interprets UInt8::MAX#to_f64! interprets Int64::MIN#to_i8! interprets Int64::MIN#to_i8! interprets UInt16::MAX#to_f64! interprets UInt16::MAX#to_f64! interprets Int64::MAX#to_i64! interprets Int64::MAX#to_i64! interprets UInt16::MAX#to_u! interprets UInt16::MAX#to_u! interprets UInt32::MAX#to_i8! interprets UInt32::MAX#to_i8! interprets Int16::MIN#to_u16! interprets Int16::MIN#to_u16! interprets UInt32::MAX#to_f32! interprets UInt32::MAX#to_f32! interprets Float64#to_f64! (negative) interprets Float64#to_f64! (negative) interprets Int8::MAX#to_i8! interprets Int8::MAX#to_i8! interprets Int64::MIN#to_u32! interprets Int64::MIN#to_u32! interprets UInt8::MAX#to_u! interprets UInt8::MAX#to_u! interprets Int32::MAX#to_i8! interprets Int32::MAX#to_i8! interprets Int64::MAX#to_i! interprets Int64::MAX#to_i! interprets Int8::MAX#to_u64! interprets Int8::MAX#to_u64! interprets UInt64::MAX#to_u32! interprets UInt64::MAX#to_u32! interprets Int32::MIN#to_f32! interprets Int32::MIN#to_f32! interprets Float64#to_f32! (negative) interprets Float64#to_f32! (negative) interprets Float64#to_u32! (positive) interprets Float64#to_u32! (positive) interprets Float64#to_i16! (positive) interprets Float64#to_i16! (positive) interprets Int16::MIN#to_i64! interprets Int16::MIN#to_i64! interprets UInt32::MAX#to_i! interprets UInt32::MAX#to_i! interprets Int16::MIN#to_u64! interprets Int16::MIN#to_u64! interprets UInt8::MAX#to_i16! interprets UInt8::MAX#to_i16! interprets Int8::MIN#to_u16! interprets Int8::MIN#to_u16! interprets Int32::MAX#to_u! interprets Int32::MAX#to_u! interprets Float64#to_i32! (negative) interprets Float64#to_i32! (negative) interprets Int8::MIN#to_i32! interprets Int8::MIN#to_i32! interprets Float32#to_i8! (positive) interprets Float32#to_i8! (positive) interprets Int32::MAX#to_i32! interprets Int32::MAX#to_i32! interprets Char#ord interprets Char#ord interprets Float64#to_i! (positive) interprets Float64#to_i! (positive) interprets Int16::MAX#to_i! interprets Int16::MAX#to_i! interprets Int16::MAX#to_i32! interprets Int16::MAX#to_i32! interprets Int16::MAX#to_u! interprets Int16::MAX#to_u! interprets UInt64::MAX#to_i64! interprets UInt64::MAX#to_i64! local variables interprets variable set interprets variable set interprets local variable declaration (#12229) interprets local variable declaration (#12229) interprets uninitialized interprets uninitialized doesn't declare variable with no type doesn't declare variable with no type doesn't declare variable with no type inside method doesn't declare variable with no type inside method interprets at the class level interprets at the class level assigns to underscore assigns to underscore interprets variable set and get interprets variable set and get interprets variable set and get, second local var interprets variable set and get, second local var doesn't discard underscore right hand side doesn't discard underscore right hand side interprets variable set and get with operations interprets variable set and get with operations interprets variable set with type restriction (#13023) interprets variable set with type restriction (#13023) comparisons interprets UInt64.unsafe_mod(UInt64) interprets UInt64.unsafe_mod(UInt64) interprets UInt8 < Int32 (false, right is less than zero) interprets UInt8 < Int32 (false, right is less than zero) interprets UInt32 < Int32 (false) interprets UInt32 < Int32 (false) interprets Float32 / Int32 interprets Float32 / Int32 interprets Float64 / Float64 interprets Float64 / Float64 interprets Float64 < Float64 interprets Float64 < Float64 discards comparison discards comparison interprets Bool != Bool (true) interprets Bool != Bool (true) interprets UInt32 < Int32 (true) interprets UInt32 < Int32 (true) interprets Int32 == Int32 (false) interprets Int32 == Int32 (false) interprets Int32 == Int32 (true) interprets Int32 == Int32 (true) interprets UInt64 != Int32 (false) interprets UInt64 != Int32 (false) interprets Float32 fdiv Float64 interprets Float32 fdiv Float64 interprets Int32 < Float64 interprets Int32 < Float64 interprets UInt8 < Int32 (true, right is greater than zero) interprets UInt8 < Int32 (true, right is greater than zero) interprets Int32 != Int32 (false) interprets Int32 != Int32 (false) interprets Int32 != Int32 (true) interprets Int32 != Int32 (true) interprets Int128 == Int128 (true) interprets Int128 == Int128 (true) interprets Char == Char (true) interprets Char == Char (true) interprets Int128 == Int128 (false) interprets Int128 == Int128 (false) interprets UInt64 > UInt32 (false) interprets UInt64 > UInt32 (false) interprets Int32 == Float64 (false) interprets Int32 == Float64 (false) interprets UInt8 < Int32 (false, right is greater than zero) interprets UInt8 < Int32 (false, right is greater than zero) interprets Float64 < Int32 interprets Float64 < Int32 interprets Char == Char (false) interprets Char == Char (false) interprets Int32 != UInt64 (false) interprets Int32 != UInt64 (false) interprets Bool != Bool (false) interprets Bool != Bool (false) interprets UInt64 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is less than zero) interprets UInt64 < Int32 (false, right is greater than zero) interprets UInt64 < Int32 (false, right is greater than zero) interprets Int32 == UInt64 (false) interprets Int32 == UInt64 (false) interprets Int32 == Float64 (true) interprets Int32 == Float64 (true) interprets UInt64 == Int32 (false when Int32 < 0) interprets UInt64 == Int32 (false when Int32 < 0) interprets Int32 == UInt64 (true) interprets Int32 == UInt64 (true) interprets UInt64 > UInt32 (true) interprets UInt64 > UInt32 (true) interprets Bool == Bool (true) interprets Bool == Bool (true) interprets Int32 < Int32 interprets Int32 < Int32 interprets Float64 fdiv Float32 interprets Float64 fdiv Float32 interprets UInt64 == Int32 (true when Int32 >= 0) interprets UInt64 == Int32 (true when Int32 >= 0) interprets Int32 > Float64 (false) interprets Int32 > Float64 (false) interprets UInt64 != Int32 (true) interprets UInt64 != Int32 (true) interprets Int32 > Float64 (true) interprets Int32 > Float64 (true) interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 < Int32 (true, right is greater than zero) interprets UInt64 == Int32 (false when Int32 >= 0) interprets UInt64 == Int32 (false when Int32 >= 0) interprets Float32 / Float32 interprets Float32 / Float32 interprets Bool == Bool (false) interprets Bool == Bool (false) interprets Int32 != UInt64 (true) interprets Int32 != UInt64 (true) logical operations interprets not for generic class instance metaclass interprets not for generic class instance metaclass interprets not for mixed union (other) interprets not for mixed union (other) interprets not for 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 bool false interprets not for bool false interprets not for nil type interprets not for nil type interprets not for nilable type (false) interprets not for nilable type (false) does math convert on union does math convert on union interprets not for nilable type (true) interprets not for nilable type (true) interprets not for nilable proc type (true) interprets not for nilable proc type (true) interprets not for mixed union (true) interprets not for mixed union (true) interprets not for bool true interprets not for bool true interprets not for nilable type (false) interprets not for nilable type (false) discards bool not discards bool not interprets not for generic class instance type interprets not for generic class instance type interprets not for mixed union (false) interprets not for mixed union (false) does math primitive on union does math primitive on union interprets not for generic module metaclass interprets not for generic module metaclass interprets not for module (#12918) interprets not for module (#12918) interprets not for generic module interprets not for generic module interprets not for mixed union (nil) interprets not for mixed union (nil) interprets not for nil interprets not for nil interprets not for bool false interprets not for bool false discards nil not discards nil not literals interprets an Int8 interprets an Int8 interprets nil interprets nil interprets a Float32 interprets a Float32 interprets a String literal interprets a String literal interprets an UInt16 interprets an UInt16 uses a string pool uses a string pool interprets an UInt128 interprets an UInt128 interprets a bool (true) interprets a bool (true) interprets an UInt32 interprets an UInt32 interprets an UInt8 interprets an UInt8 interprets an Int32 interprets an Int32 interprets a char interprets a char interprets an Int64 interprets an Int64 interprets an Int16 interprets an Int16 interprets a Float64 interprets a Float64 interprets an Int128 interprets an Int128 interprets an UInt64 interprets an UInt64 interprets a bool (false) interprets a bool (false) precomputes string literal length precomputes string literal length overflow - overflows on 1_u64 - 2 overflows on 1_u64 - 2 overflows on 1_i16 - 32770 overflows on 1_i16 - 32770 overflows on 1_i64 - 9223372036854775810_u64 overflows on 1_i64 - 9223372036854775810_u64 overflows on 1 - 2147483650_i64 overflows on 1 - 2147483650_i64 overflows on 1_u8 - 2 overflows on 1_u8 - 2 overflows on 1_i8 - 256 overflows on 1_i8 - 256 overflows on 1_u16 - 2 overflows on 1_u16 - 2 overflows on 1_u32 - 2 overflows on 1_u32 - 2 + overflows on 1 + 2147483647 overflows on 1 + 2147483647 overflows on 1_i16 + 32767 overflows on 1_i16 + 32767 overflows on 1_u64 + 18446744073709551615_u64 overflows on 1_u64 + 18446744073709551615_u64 overflows on 1_u32 + 4294967295_i64 overflows on 1_u32 + 4294967295_i64 overflows on 1_i8 + 128 overflows on 1_i8 + 128 overflows on 1_i64 + 9223372036854775807_i64 overflows on 1_i64 + 9223372036854775807_i64 overflows on 1_u8 + 255 overflows on 1_u8 + 255 overflows on 1_u16 + 65535 overflows on 1_u16 + 65535 * overflows on 10_u8 * 26 overflows on 10_u8 * 26 overflows on 20 * 214748364 overflows on 20 * 214748364 overflows on 10_i16 * 3300 overflows on 10_i16 * 3300 overflows on 20_u32 * 429496729 overflows on 20_u32 * 429496729 overflows on 20_u64 * 1844674407370955161_i64 overflows on 20_u64 * 1844674407370955161_i64 overflows on 10_i8 * 14 overflows on 10_i8 * 14 overflows on 20_i64 * 922337203685477580_i64 overflows on 20_i64 * 922337203685477580_i64 overflows on 10_u16 * 6600 overflows on 10_u16 * 6600 conversion overflows on 128_u8.to_i8 overflows on 128_u8.to_i8 overflows on 128_f64.to_i8 overflows on 128_f64.to_i8 overflows on -1_i64.to_u64 overflows on -1_i64.to_u64 overflows on 32768_f64.to_i16 overflows on 32768_f64.to_i16 overflows on 32768_u64.to_i16 overflows on 32768_u64.to_i16 overflows on 2147483648_u64.to_i32 overflows on 2147483648_u64.to_i32 overflows on 128_u16.to_i8 overflows on 128_u16.to_i8 overflows on 32768_u32.to_i16 overflows on 32768_u32.to_i16 overflows on -1_i8.to_u32 overflows on -1_i8.to_u32 overflows on 128_u64.to_i8 overflows on 128_u64.to_i8 overflows on 1.7976931348623157e+308.to_f32 overflows on 1.7976931348623157e+308.to_f32 overflows on -1.to_u16 overflows on -1.to_u16 overflows on 65536_f64.to_u16 overflows on 65536_f64.to_u16 overflows on -1_i16.to_u64 overflows on -1_i16.to_u64 overflows on 9223372036854775808_u64.to_i64 overflows on 9223372036854775808_u64.to_i64 overflows on 2147483648_f64.to_i32 overflows on 2147483648_f64.to_i32 overflows on -1_i8.to_u64 overflows on -1_i8.to_u64 overflows on 32768_u16.to_i16 overflows on 32768_u16.to_i16 overflows on 128_f32.to_i8 overflows on 128_f32.to_i8 overflows on 32768_f32.to_i16 overflows on 32768_f32.to_i16 overflows on 128_u32.to_i8 overflows on 128_u32.to_i8 overflows on -1_i8.to_u16 overflows on -1_i8.to_u16 overflows on -1_i64.to_u16 overflows on -1_i64.to_u16 overflows on -1_i8.to_u8 overflows on -1_i8.to_u8 overflows on 65536_f32.to_u16 overflows on 65536_f32.to_u16 overflows on -1.to_u32 overflows on -1.to_u32 overflows on -1_i64.to_u8 overflows on -1_i64.to_u8 overflows on -1.to_u8 overflows on -1.to_u8 overflows on 256_f32.to_u8 overflows on 256_f32.to_u8 overflows on -1_i64.to_u32 overflows on -1_i64.to_u32 overflows on 256_f64.to_u8 overflows on 256_f64.to_u8 overflows on 4294967296_f64.to_u32 overflows on 4294967296_f64.to_u32 overflows on 2147483648_u32.to_i32 overflows on 2147483648_u32.to_i32 overflows on -1_i16.to_u16 overflows on -1_i16.to_u16 overflows on -1_i16.to_u8 overflows on -1_i16.to_u8 overflows on -1_i16.to_u32 overflows on -1_i16.to_u32 overflows on -1.to_u64 overflows on -1.to_u64 math interprets Int128 + Int32 interprets Int128 + Int32 interprets Int64 + Int64 interprets Int64 + Int64 interprets Float64 + Float64 interprets Float64 + Float64 interprets Int32 + Int32 interprets Int32 + Int32 interprets Int32 &+ Int32 interprets Int32 &+ Int32 interprets UInt64 * Int32 interprets UInt64 * Int32 interprets Int32 * Int32 interprets Int32 * Int32 discards math discards math interprets UInt8 | Int32 interprets UInt8 | Int32 interprets Float32 + Float64 interprets Float32 + Float64 interprets Int8 + Int8 interprets Int8 + Int8 interprets Int32 &* Int32 interprets Int32 &* Int32 interprets UInt64 | UInt32 interprets UInt64 | UInt32 interprets Int32 + Float64 interprets Int32 + Float64 interprets Int32 &- Int32 interprets Int32 &- Int32 interprets Float64 - Float64 interprets Float64 - Float64 interprets Int32.unsafe_shl(Int32) with self interprets Int32.unsafe_shl(Int32) with self interprets Float64 * Float64 interprets Float64 * Float64 interprets Int32 - Int32 interprets Int32 - Int32 interprets UInt64 & Int32 interprets UInt64 & Int32 interprets Float64 + Int32 interprets Float64 + Int32 interprets UInt32 - Int32 interprets UInt32 - Int32 Code gen: multi assign supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports 1 to n assignment, raises if too short supports m to n assignment, with splat on left-hand side (2) supports m to n assignment, with splat on left-hand side (2) supports 1 to n assignment, with splat on left-hand side (2) supports 1 to n assignment, with splat on left-hand side (2) 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 n to n assignment supports n to n assignment supports m to n assignment, splat is empty tuple (1) supports m to n assignment, splat is empty tuple (1) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, raises if out of bounds (2) supports 1 to n assignment, splat is empty (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, splat is empty tuple (2) supports m to n assignment, splat is empty tuple (2) strict_multi_assign raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count raises if value size in 1 to n assignment doesn't match target count supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports 1 to n assignment supports m to n assignment, 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 (3) supports 1 to n assignment, with splat on left-hand side (3) supports m to n assignment, splat is empty tuple (3) supports m to n assignment, splat is empty tuple (3) supports 1 to n assignment, splat is empty (3) supports 1 to n assignment, splat is empty (3) without strict_multi_assign supports 1 to n assignment supports 1 to n assignment 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 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) codegen: previous_def codegens previous def when inside fun and forwards args codegens previous def when inside fun and forwards args correctly passes named arguments correctly passes named arguments codegens previous def codegens previous def codegens previous def when inside fun with self codegens previous def when inside fun with self Crystal::Repl::Interpreter autocast autocasts symbol to enum autocasts symbol to enum 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 in multidispatch (#11782) autocasts symbol to enum in multidispatch (#11782) autocasts integer var to float (#12560) autocasts integer var to float (#12560) autocasts int in multidispatch autocasts int in multidispatch autocasts float32 var to float64 (#12560) autocasts float32 var to float64 (#12560) autocasts integer var to integer (#12560) autocasts integer var to integer (#12560) autocasts number literal to integer autocasts number literal to integer Codegen: special vars 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 preserves special vars in macro expansion with call with default arguments (#824) preserves special vars in macro expansion with call with default arguments (#824) codegens $~ with nilable (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 $~ two levels codegens $~ two levels allows with primitive allows with primitive works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily works lazily codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens in block with nested block codegens $~ 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 $~ codegens $~ 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 codegens $? codegens $? codegens with default argument codegens with default argument codegens after block 2 codegens after block 2 codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) codegens $? with nilable (2) preserves special vars if initialized inside block (#2194) preserves special vars if initialized inside block (#2194) allows with struct allows with struct Code gen: splat splats on call splats on call splats without args splats without args splats in initialize splats in initialize splats with another arg splats with another arg splats with default value (3) splats with default value (3) evaluates splat argument just once (#2677) evaluates splat argument just once (#2677) splats splats splats with default value splats with default value splats with default value (2) splats with default value (2) does #2407 does #2407 Normalize: expressions normalizes an empty expression with begin/end normalizes an empty expression with begin/end normalizes an expression normalizes an expression normalizes expressions with begin/end normalizes expressions with begin/end Normalize: chained comparisons normalizes one comparison with var normalizes one comparison with var normalizes two comparisons with literal normalizes two comparisons with literal normalizes one comparison with literal normalizes one comparison with literal normalizes two comparisons with calls normalizes two comparisons with calls normalizes one comparison with call normalizes one comparison with call Crystal::ABI::AVR size for float for float for double for double for array for array for integer for integer for packed struct for packed struct for struct for struct for pointer for pointer abi_info float float multiple arguments multiple arguments int32 int32 struct args over 18 bytes struct args over 18 bytes returns struct over 8 bytes returns struct over 8 bytes returns struct within 8 bytes returns struct within 8 bytes int16 int16 multiple arguments above registers multiple arguments above registers int8 int8 int64 int64 int1 int1 double double struct args within 18 bytes struct args within 18 bytes align for packed struct for packed struct for struct for struct for double for double for float for float for integer for integer for pointer for pointer for array for array Code gen: macro 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) forwards file location forwards file location can refer to union (2) can refer to union (2) can refer to union (1) can refer to union (1) 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 refer to abstract (2) can refer to abstract (2) expands inline macro if (false) expands inline macro if (false) initializes class var in macro initializes class var in macro allows overriding macro definition when redefining base class allows overriding macro definition when redefining base class checks if macro expansion returns (#821) checks if macro expansion returns (#821) codegens macro with comment (bug) (#1396) codegens macro with comment (bug) (#1396) expands @def in inline macro expands @def in inline macro fixes empty types of macro expansions (#1379) fixes empty types of macro expansions (#1379) responds correctly to has_constant? with @top_level responds correctly to has_constant? with @top_level expands def macro with var expands def macro with var executes subclasses executes subclasses 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 keeps heredoc contents inside macro keeps heredoc contents inside macro uses indexed macro variable uses indexed macro variable doesn't skip abstract classes when defining macro methods doesn't skip abstract classes when defining macro methods types macro expansion bug (#1734) types macro expansion bug (#1734) executes with named arguments executes with named arguments expands macro as class method and accesses @type expands macro as class method and accesses @type can access type variables of a tuple can access type variables of a tuple expands macro def with return (#1040) expands macro def with return (#1040) expands macro with default arg and splat (3) (#784) expands macro with default arg and splat (3) (#784) doesn't replace %s in string (#2178) doesn't replace %s in string (#2178) expands macro with arguments expands macro with arguments runs macro with splat runs macro with splat does block unpacking inside macro expression (#13707) does block unpacking inside macro expression (#13707) gets enum members with @type.constants gets enum members with @type.constants keeps line number with no block keeps line number with no block implicitly marks method as macro def when using @type implicitly marks method as macro def when using @type expands inline macro if (true) expands inline macro if (true) expands def macro with @type.name with virtual expands def macro with @type.name with virtual expands @def in macro expands @def in macro expands macro with default arg and splat (#784) expands macro with default arg and splat (#784) can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal can use macro inside array literal transforms hooks (bug) transforms hooks (bug) expands @type.name in virtual metaclass (1) expands @type.name in virtual metaclass (1) expands macro defined in base class expands macro defined in base class expands macro and resolves type correctly expands macro and resolves type correctly expands def macro with @type.instance_vars with subclass expands def macro with @type.instance_vars with subclass replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) replaces %s inside string inside interpolation, with braces (#2178) expands macro with escaped quotes (#895) expands macro with escaped quotes (#895) can access type variables can access type variables expands macro defined in class expands macro defined in class expands def macro with instance var and method call (bug) expands def macro with instance var and method call (bug) determines if overrides (false) determines if overrides (false) determines if method exists (false) determines if method exists (false) devirtualizes @type devirtualizes @type forwards dir location forwards dir location expands def macro with @type.instance_vars expands def macro with @type.instance_vars executes with named arguments for positional arg (1) executes with named arguments for positional arg (1) stringifies type without virtual marker stringifies type without virtual marker can use constants can use constants can refer to types can refer to types can refer to abstract (1) can refer to abstract (1) access to the program with @top_level access to the program with @top_level executes all_subclasses executes all_subclasses doesn't override local variable when using macro variable doesn't override local variable when using macro variable 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 inline macro for expands inline macro for determines if overrides (true) determines if overrides (true) expands Path with resolve method expands Path with resolve method expands inline macro expands inline macro uses tuple T in method with free vars uses tuple T in method with free vars finds macro in class finds macro in class uses invocation context uses invocation context codegens macro def with splat (#496) codegens macro def with splat (#496) can refer to @type can refer to @type determines if overrides, through another class (true) determines if overrides, through another class (true) expands macro that invokes another macro expands macro that invokes another macro expands def macro with @type.instance_vars with virtual expands def macro with @type.instance_vars with virtual can iterate union types can iterate union types expands macro that yields expands macro that yields allows macro with default arguments allows macro with default arguments can access type variables of a module can access type variables of a module correctly recomputes call (bug) correctly recomputes call (bug) expands def macro with @type.name with virtual (2) expands def macro with @type.name with virtual (2) keeps line number with a block keeps line number with a block determines if method exists (true) determines if method exists (true) retains original yield expression (#2923) retains original yield expression (#2923) gets default value of instance variable gets default value of instance variable 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) gets constant gets constant resolves alias in macro resolves alias in macro expands def macro expands def macro gets methods gets methods accepts compile-time flags accepts compile-time flags declares constant in macro (#838) declares constant in macro (#838) expands macro as class method expands macro as class method can access type variables that are not types can access type variables that are not types expands @type.name in virtual metaclass (2) expands @type.name in virtual metaclass (2) correctly resolves constant inside block in macro def correctly resolves constant inside block in macro def receives &block receives &block executes with named arguments for positional arg (2) executes with named arguments for positional arg (2) runs macro with arg and splat runs macro with arg and splat errors if dynamic constant assignment after macro expansion errors if dynamic constant assignment after macro expansion expands macro with default arg and splat (2) (#784) expands macro with default arg and splat (2) (#784) determines if overrides, through module (true) determines if overrides, through module (true) can access free variables can access free variables finds macro from virtual type finds macro from virtual type initializes instance var in macro initializes instance var in macro expands macro expands macro says that enum has Flags annotation says that enum has Flags annotation expands def macro with @type.name expands def macro with @type.name doesn't override local variable when using macro variable (2) doesn't override local variable when using macro variable (2) can access type variables of a generic type can access type variables of a generic type passes #826 passes #826 executes with named arguments for positional arg (3) executes with named arguments for positional arg (3) 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 surrounds {{yield}} with begin/end surrounds {{yield}} with begin/end 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, with macro method (false) determines if overrides, with macro method (false) determines if variable has default value determines if variable has default value says that enum doesn't have Flags annotation says that enum doesn't have Flags annotation gets enum members as constants gets enum members as constants gets correct class name when there are classes in the middle gets correct class name when there are classes in the middle 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 uses indexed macro variable with many keys uses indexed macro variable with many keys doesn't replace %q() (#2178) doesn't replace %q() (#2178) doesn't reuse macro nodes (bug) doesn't reuse macro nodes (bug) forwards line number forwards line number Normalize: and normalizes and with variable on the left normalizes and with variable on the left normalizes and without variable normalizes and without variable normalizes and with is_a? on exp normalizes and with is_a? on exp 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 normalizes and with assignment normalizes and with assignment normalizes and with ! on var normalizes and with ! on var Semantic: automatic cast casts Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction casts integer expression to larger type (#9565) casts integer expression to larger type (#9565) can autocast to union in default value can autocast to union in default value can autocast to union in default value (multiple enums) can autocast to union in default value (multiple enums) casts literal integer (Int64 -> Int32, too big) casts literal integer (Int64 -> Int32, too big) 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 literal integer through alias with union casts literal integer through alias with union casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) autocasts integer variable to float type (#9565) autocasts integer variable to float type (#9565) doesn't autocast number on union (#8655) doesn't autocast number on union (#8655) casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration 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 use automatic cast with `with ... yield` (#7736) can use automatic cast with `with ... yield` (#7736) can autocast to union in default value (symbol and int) can autocast to union in default value (symbol and int) casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment says ambiguous call for integer on alias (#6620) says ambiguous call for integer on alias (#6620) autocasts nested type from non-nested type (#10315) autocasts nested type from non-nested type (#10315) casts integer variable to larger type (Int64 to Int128) (#9565) casts integer variable to larger type (Int64 to Int128) (#9565) matches correct overload matches correct overload says ambiguous call for symbol says ambiguous call for symbol doesn't cast integer variable to larger type (not #9565) doesn't cast integer variable to larger type (not #9565) casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) errors if symbol name doesn't match enum member errors if symbol name doesn't match enum member says ambiguous call for integer var to larger type (#9565) says ambiguous call for integer var to larger type (#9565) doesn't do multidispatch if an overload matches exactly (#8217) doesn't do multidispatch if an overload matches exactly (#8217) casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) says ambiguous call for integer says ambiguous call for integer says ambiguous call on union (#8655) says ambiguous call on union (#8655) casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) 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) doesn't do multidispatch if an overload matches exactly (#8217) doesn't do multidispatch if an overload matches exactly (#8217) autocasts first argument and second matches without autocast autocasts first argument and second matches without autocast casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration errors when autocast default value doesn't match enum member errors when autocast default value doesn't match enum member casts symbol literal to enum casts symbol literal to enum autocasts float32 variable to float64 type (#9565) autocasts float32 variable to float64 type (#9565) says ambiguous call for integer var to union type (#9565) says ambiguous call for integer var to union type (#9565) casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment casts literal integer through alias with union casts literal integer through alias with union can autocast to alias in default value can autocast to alias in default value can match multiple times with the same argument type (#7578) can match multiple times with the same argument type (#7578) casts literal integer (Int32 -> no restriction) casts literal integer (Int32 -> no restriction) says ambiguous call for integer (2) says ambiguous call for integer (2) casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment 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 Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic casts integer variable to larger type (#9565) casts integer variable to larger type (#9565) casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) Semantic: uninitialized disallows declaring var of type Object disallows declaring var of type Object disallows declaring var of type Reference disallows declaring var of type Reference declares an instance variable in initialize as uninitialized declares an instance variable in initialize as uninitialized errors if declaring generic type without type vars (with instance var) errors if declaring generic type without type vars (with instance var) disallows declaring var of type Value disallows declaring var of type Value errors if declares var and then assigns other type errors if declares var and then assigns other type declares as uninitialized and reads it declares as uninitialized and reads it errors if declaring generic type without type vars (with class var) errors if declaring generic type without type vars (with class var) can use uninitialized with class type (#2940) can use uninitialized with class type (#2940) errors if declaring variable multiple times with different types (#917) errors if declaring variable multiple times with different types (#917) can uninitialize variable outside initialize, generic (#2828) can uninitialize variable outside initialize, generic (#2828) uses virtual type for uninitialized (#8216) uses virtual type for uninitialized (#8216) disallows declaring var of type Float disallows declaring var of type Float disallows declaring var of type Class disallows declaring var of type Class disallows declaring var of type Enum disallows declaring var of type Enum works with uninitialized NoReturn (#3314) works with uninitialized NoReturn (#3314) declares as uninitialized declares as uninitialized disallows declaring var of type Struct disallows declaring var of type Struct disallows declaring var of type Number disallows declaring var of type Number has type (#3641) has type (#3641) can uninitialize variable outside initialize (#2828) can uninitialize variable outside initialize (#2828) disallows declaring var of type Int disallows declaring var of type Int Semantic: exception marks proc literal as raises marks proc literal as raises doesn't type instance variable as nilable if assigned inside an exception handler after being assigned doesn't type instance variable as nilable if assigned inside an exception handler after being assigned can't use next inside block inside ensure (#4470) can't use next inside block inside ensure (#4470) can use next inside block inside ensure (#4470) can use next inside block inside ensure (#4470) type is union of main and rescue blocks type is union of main and rescue blocks marks method calling lib fun that raises as raises marks method calling lib fun that raises as raises marks method that calls another method that raises as raises, recursively marks method that calls another method that raises as raises, recursively doesn't infect type to variable before handler (#4002) doesn't infect type to variable before handler (#4002) errors if caught exception is not a subclass of Exception without var errors if caught exception is not a subclass of Exception without var types 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 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 use next inside while inside ensure (#4470) can use next inside while inside ensure (#4470) 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) types instance variable as nilable if assigned inside an exception handler (#1845) types instance variable as nilable if assigned inside an exception handler (#1845) transform nodes in else block transform nodes in else block type union with empty rescue block type union with empty rescue block assigns var inside ensure (1) (#3919) assigns var inside ensure (1) (#3919) type for exception handler for explicit types type for exception handler for explicit types 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) says syntax error on "begin; rescue ex; rescue; end; ex" says syntax error on "begin; rescue ex; rescue; end; ex" types var as nilable inside ensure (2) types var as nilable inside ensure (2) remains nilable after rescue remains nilable after rescue types a var after begin rescue with no-return in rescue types a var after begin rescue with no-return in rescue detects reading nil-if-read variable after exception handler (#4723) detects reading nil-if-read variable after exception handler (#4723) types var as nilable if previously nilable (1) types var as nilable if previously nilable (1) types exception with type types exception with type correctly types variable assigned inside nested exception handler (#9769) correctly types variable assigned inside nested exception handler (#9769) marks instance variable as nilable if assigned inside rescue inside initialize marks instance variable as nilable if assigned inside rescue inside initialize correctly types #1988 correctly types #1988 types exception var with no types types exception var with no types types var as nilable if previously nilable (2) types var as nilable if previously nilable (2) assigns var inside ensure (2) (#3919) assigns var inside ensure (2) (#3919) can't use break inside block inside ensure (#4470) can't use break inside block inside ensure (#4470) types code with abstract exception that delegates method types code with abstract exception that delegates method 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 doesn't crash on break inside rescue, in while (#2441) doesn't crash on break inside rescue, in while (#2441) type union with empty main block type union with empty main block marks fun as raises marks fun as raises can use break inside while inside ensure (#4470) can use break inside while inside ensure (#4470) can't return from ensure (#4470) can't return from ensure (#4470) gets a non-nilable type if all rescue are unreachable (#8751) gets a non-nilable type if all rescue are unreachable (#8751) marks def as raises marks def as raises marks method calling method that raises as raises marks method calling method that raises as raises types var assignment inside block inside exception handler (#3324) types var assignment inside block inside exception handler (#3324) can use break inside block inside ensure (#4470) can use break inside block inside ensure (#4470) errors if caught exception is not a subclass of Exception errors if caught exception is not a subclass of Exception says syntax error on "begin; rescue ex; rescue ex : Foo; end; ex" says syntax error on "begin; rescue ex; rescue ex : Foo; end; ex" says syntax error on "begin; else; 1; end" says syntax error on "begin; else; 1; end" shadows local variable (1) shadows local variable (1) can't use next inside while inside ensure (#4470) can't use next inside while inside ensure (#4470) doesn't consider vars as nilable inside else (#610) doesn't consider vars as nilable inside else (#610) types a var after rescue as being nilable types a var after rescue as being nilable can't use break inside while inside ensure (#4470) can't use break inside while inside ensure (#4470) can't return from block inside ensure (#4470) can't return from block inside ensure (#4470) errors if caught exception is a nested union but not all types are valid errors if caught exception is a nested union but not all types are valid types a var after begin rescue as having all possible types in begin and rescue (2) types a var after begin rescue as having all possible types in begin and rescue (2) can't return from while inside ensure (#4470) can't return from while inside ensure (#4470) types var as nilable inside ensure (1) types var as nilable inside ensure (1) Semantic: nilable instance var 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) says instance var was used before initialized (2) says instance var was used before initialized (2) marks instance var as nilable if assigned inside captured block (#1696) marks instance var as nilable if assigned inside captured block (#1696) says instance var was used before initialized says instance var was used before initialized 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) marks instance var as nilable if assigned inside proc literal marks instance var as nilable if assigned inside proc literal doesn't consider as nil if initialized with catch-all doesn't consider as nil if initialized with catch-all says instance var was not initialized in all of the initialize methods says instance var was not initialized in all of the initialize methods 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 self was used before instance var was initialized says self was used before instance var was initialized finds type that doesn't initialize instance var (#1222) finds type that doesn't initialize instance var (#1222) Semantic: not types not as NoReturn if exp is NoReturn types not as NoReturn if exp is NoReturn filters types inside if filters types inside if doesn't restrict and in while (#4243) doesn't restrict and in while (#4243) filters types inside if/else filters types inside if/else types not types not doesn't restrict and doesn't restrict and filters types with !is_a? filters types with !is_a? Code gen: def with default value codegens def with one default value codegens def with one default value resolves expanded call to current type, not to virtual type resolves expanded call to current type, not to virtual type considers first the one with a restriction considers first the one with a restriction considers first the one with more arguments considers first the one with more arguments doesn't mix types of instance vars with initialize and new doesn't mix types of instance vars with initialize and new codegens def new with one default value codegens def new with one default value Crystal::Playground::Agent should send json messages and return inspected value should send json messages and return inspected value Crystal::Repl::Interpreter pointers pointerof class var pointerof class var pointerof read instance var pointerof read instance var discards pointer malloc discards pointer malloc discards pointer add discards pointer add interprets pointer new and pointer address interprets pointer new and pointer address interprets pointer set and get (union type, setter value) interprets pointer set and get (union type, setter value) interprets pointer realloc interprets pointer realloc discards pointer set discards pointer set pointerof read `StaticArray#@buffer` (1) pointerof read `StaticArray#@buffer` (1) interprets pointer set and get (clear stack) interprets pointer set and get (clear stack) interprets pointerof and mutates memory (there are more variables) interprets pointerof and mutates memory (there are more variables) interprets pointer diff interprets pointer diff discards pointer new discards pointer new pointerof instance var pointerof instance var interprets nilable pointer truthiness interprets nilable pointer truthiness interprets pointerof, mutates var, read pointer interprets pointerof, mutates var, read pointer pointerof read `StaticArray#@buffer` (2) pointerof read `StaticArray#@buffer` (2) discards pointer realloc discards pointer realloc interprets pointer diff, negative interprets pointer diff, negative discards pointerof discards pointerof interprets pointer add interprets pointer add interprets pointerof, mutates pointer, read var interprets pointerof, mutates pointer, read var interprets pointer set and get (int) interprets pointer set and get (int) discards pointer diff discards pointer diff interprets pointer realloc wrapper interprets pointer realloc wrapper interprets pointer set and get (union type) interprets pointer set and get (union type) interprets pointer set and get (bool) interprets pointer set and get (bool) discards pointer get discards pointer get Normalize: return next break removes nodes after next removes nodes after next removes nodes after if that returns in both branches removes nodes after if that returns in both branches removes nodes after return removes nodes after return doesn't remove nodes after if that returns in one branch doesn't remove nodes after if that returns in one branch removes nodes after break removes nodes after break doesn't remove after return when there's an unless doesn't remove after return when there's an unless Code gen: debug codegens extern union (#7335) codegens extern union (#7335) doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail on splat expansions inside array-like literals doesn't fail if class var initializer is followed by metaclass (#15970) doesn't fail if class var initializer is followed by metaclass (#15970) doesn't fail if no top-level code follows discarded class var initializer (#15970) doesn't fail if no top-level code follows discarded class var initializer (#15970) stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (3) stores and restores debug location after jumping to main (#6920) stores and restores debug location after jumping to main (#6920) doesn't emit incorrect debug info for closured self doesn't emit incorrect debug info for closured self stores and restores debug location after jumping to main (2) stores and restores debug location after jumping to main (2) codegens lib union (#7335) codegens lib union (#7335) 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) doesn't emit debug info for unused variable declarations (#9882) doesn't emit debug info for unused variable declarations (#9882) 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) doesn't fail on constant read calls (#11416) doesn't fail on constant read calls (#11416) codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for new with custom allocate (#3945) codegens correct debug info for untyped expression (#4007 and #4008) codegens correct debug info for untyped expression (#4007 and #4008) has debug info in closure inside if (#5593) has debug info in closure inside if (#5593) Semantic: def overload restricts union to generic class restricts union to generic class matches types with free variables matches types with free variables single type restriction wins over union single type restriction wins over union matches generic class instance type with another one matches generic class instance type with another one errors when binding free variable to different types (2) errors when binding free variable to different types (2) matches a generic module argument with free var matches a generic module argument with free var matches a generic module argument matches a generic module argument errors if union restriction has multiple free vars (2) errors if union restriction has multiple free vars (2) treats single splats with same restriction as equivalent (2) (#12579) treats single splats with same restriction as equivalent (2) (#12579) matches a generic module argument with free var (2) matches a generic module argument with free var (2) matches a union metaclass argument with free var (#8071) matches a union metaclass argument with free var (#8071) types a call with overload with yield types a call with overload with yield doesn't match with wrong number of type arguments (#313) doesn't match with wrong number of type arguments (#313) doesn't crash on unknown metaclass doesn't crash on unknown metaclass dispatches with named arg dispatches with named arg can call overload with aliased generic restriction can call overload with aliased generic restriction does not consider global paths as free variables (1) does not consider global paths as free variables (1) matches tuple with underscore matches tuple with underscore gets free variable from union restriction without a union gets free variable from union restriction without a union errors if no overload matches on union against named arg (#2640) errors if no overload matches on union against named arg (#2640) errors if generic type doesn't match errors if generic type doesn't match types a call with overload self in included module other type types a call with overload self in included module other type does not consider global paths as free variables (2) does not consider global paths as free variables (2) gives better error message with consecutive arguments sizes gives better error message with consecutive arguments sizes types a call with overload self in included module types a call with overload self in included module overloads on metaclass (#2916) overloads on metaclass (#2916) compare self type with others compare self type with others types a call with overload selecting the most restrictive 2 types a call with overload selecting the most restrictive 2 accepts overload with nilable type restriction accepts overload with nilable type restriction types a call with overload self types a call with overload self filter union type with virtual filter union type with virtual types a call with overload matches virtual 3 types a call with overload matches virtual 3 gives correct error message, looking up parent defs, when no overload matches gives correct error message, looking up parent defs, when no overload matches doesn't match tuples of different sizes doesn't match tuples of different sizes 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 tuples and uses free var matches tuples and uses free var types a call with overload type first overload types a call with overload type first overload lookup matches in virtual type inside union lookup matches in virtual type inside union types a call with overload matches virtual types a call with overload matches virtual dispatch call to def with restrictions dispatch call to def with restrictions dispatch call to def with restrictions dispatch call to def with restrictions gets free variable from union restriction (2) gets free variable from union restriction (2) reports no overload matches with correct method owner (#2083) reports no overload matches with correct method owner (#2083) restrict virtual type with virtual type restrict virtual type with virtual type matches virtual type to union matches virtual type to union compare_strictness subsumption conflicts single splat vs named single splat vs named positional vs double splat positional vs double splat positional vs named positional vs named single splat vs double splat single splat vs double splat positional vs positional positional vs positional positional vs single splat positional vs single splat named vs double splat named vs double splat named vs named named vs named named parameters named parameter with restriction vs double splat with stricter restriction named parameter with restriction vs double splat with stricter restriction double splat restriction vs double splat with stricter restriction double splat restriction vs double splat with stricter restriction specificity specificity named parameter with stricter restriction vs double splat with restriction named parameter with stricter restriction vs double splat with restriction double splat vs double splat with restriction double splat vs double splat with restriction named parameter vs double splat with restriction named parameter vs double splat with restriction named parameter with restriction vs double splat (#5328) named parameter with restriction vs double splat (#5328) specificity conflicts, named vs named (required > optional) vs (required > optional) (required > optional) vs (required > optional) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (required > splat) vs (required > splat) (required > splat) vs (required > splat) (required > optional) vs (required > splat) (required > optional) vs (required > splat) positional parameters positional parameter with stricter restriction vs single splat with restriction positional parameter with stricter restriction vs single splat with restriction positional parameter vs single splat with restriction positional parameter vs single splat with restriction positional parameter with restriction vs single splat with stricter restriction positional parameter with restriction vs single splat with stricter restriction specificity specificity single splat vs single splat with restriction (#3134) single splat vs single splat with restriction (#3134) 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 positional parameter with restriction vs single splat specificity conflicts, positional vs named (required > splat) vs (required > splat) (required > splat) vs (required > splat) (required > splat) vs (optional > splat) (required > splat) vs (optional > splat) (required > optional) vs (optional > splat) (required > optional) vs (optional > splat) (optional > splat) vs (required > splat) (optional > splat) vs (required > splat) (optional > splat) vs (optional > splat) (optional > splat) vs (optional > splat) (required > optional) vs (required > optional) (required > optional) vs (required > optional) (optional > splat) vs (required > optional) (optional > splat) vs (required > optional) (required > optional) vs (required > splat) (required > optional) vs (required > splat) (required > splat) vs (required > optional) (required > splat) vs (required > optional) subsumption has higher precedence over specificity same positional parameter, required > optional same positional parameter, required > optional named vs (required positional > optional positional) named vs (required positional > optional positional) positional vs (optional positional > single splat) positional vs (optional positional > single splat) positional vs (required positional > single splat) positional vs (required positional > single splat) named vs (optional named > double splat) named vs (optional named > double splat) single splat vs (required named > optional named) single splat vs (required named > optional named) positional vs (optional named > double splat) positional vs (optional named > double splat) named vs (optional positional > single splat) named vs (optional positional > single splat) single splat vs (optional named > double splat) single splat vs (optional named > double splat) positional vs (required named > double splat) positional vs (required named > double splat) named vs (required named > optional named) named vs (required named > optional named) named vs (required named > double splat) named vs (required named > double splat) named vs (required positional > single splat) named vs (required positional > single splat) positional vs (required positional > optional positional) positional vs (required positional > optional positional) same positional parameter, optional > single splat same positional parameter, optional > single splat same named parameter, optional > double splat same named parameter, optional > double splat double splat vs (required positional > optional positional) double splat vs (required positional > optional positional) positional vs (required named > optional named) positional vs (required named > optional named) same positional parameter, required > single splat same positional parameter, required > single splat single splat vs (required named > double splat) single splat vs (required named > double splat) same named parameter, required > optional same named parameter, required > optional double splat vs (optional positional > single splat) double splat vs (optional positional > single splat) same named parameter, required > double splat same named parameter, required > double splat double splat vs (required positional > single splat) double splat vs (required positional > single splat) gets free variable from union restriction gets free variable from union restriction overloads on metaclass (3) (#2916) overloads on metaclass (3) (#2916) considers NamedTuple in a module's including types (#10380) considers NamedTuple in a module's including types (#10380) resets free vars after a partial match is rejected (#10270) resets free vars after a partial match is rejected (#10270) resets free vars after a partial match is rejected (2) (#10185) resets free vars after a partial match is rejected (2) (#10185) overloads with named argument (#4465) overloads with named argument (#4465) restricts on generic type with free type arg restricts on generic type with free type arg matches a union argument with free var, more types (2) matches a union argument with free var, more types (2) errors if union restriction has multiple free vars errors if union restriction has multiple free vars types a call with overload self with inherited type types a call with overload self with inherited type treats single splats with same restriction as equivalent (#12579) treats single splats with same restriction as equivalent (#12579) matches a union argument with free var matches a union argument with free var overloads on metaclass (2) (#2916) overloads on metaclass (2) (#2916) restricts on generic type without type arg restricts on generic type without type arg matches a union argument with free var, more types (1) matches a union argument with free var, more types (1) errors when binding free variable to different types errors when binding free variable to different types restrict matches to minimum necessary 1 restrict matches to minimum necessary 1 types a call with overload with yield the other way types a call with overload with yield the other way can call overload with generic restriction can call overload with generic restriction matches tuples of different sizes matches tuples of different sizes matches on partial union matches on partial union includes splat symbol in error message includes splat symbol in error message 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 type second overload types a call with overload type second overload overloads union against non-union (#2904) overloads union against non-union (#2904) types a call with overload types a call with overload prefers more specific overload than one with free variables prefers more specific overload than one 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) 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) types a call with overload self other match types a call with overload self other match types a call with overload with yield after typing another call without yield types a call with overload with yield after typing another call without yield types a call with overload matches virtual 2 types a call with overload matches virtual 2 says `no overload matches` instead of `can't instantiate abstract class` on wrong argument in new method says `no overload matches` instead of `can't instantiate abstract class` on wrong argument in new method types a call with overload selecting the most restrictive types a call with overload selecting the most restrictive Semantic: alias looks up alias for macro resolution (#3548) looks up alias for macro resolution (#3548) overloads union type through alias overloads union type through alias includes module through alias includes module through alias works with alias type as restriction works with alias type as restriction allows defining recursive fun aliases allows defining recursive fun aliases errors if defining infinite recursive alias errors if defining infinite recursive alias allows defining recursive aliases allows defining recursive aliases errors if alias is already defined as another type errors if alias is already defined as another type allows using alias type as generic type allows using alias type as generic type reopens struct through alias reopens struct through alias inherits struct through alias inherits struct through alias reopens module through alias within itself reopens module through alias within itself errors if defining infinite recursive alias in union errors if defining infinite recursive alias in union allows using generic type of recursive alias as restriction (#488) allows using generic type of recursive alias as restriction (#488) allows recursive array with alias allows recursive array with alias reopens struct through alias within itself reopens struct through alias within itself can use .class in alias (#2835) can use .class in alias (#2835) reopens class through alias reopens class through alias declares alias inside type declares alias inside type uses constant in alias (#3259) uses constant in alias (#3259) errors if alias already defined errors if alias already defined 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 doesn't find type parameter in alias (#3502) doesn't find type parameter in alias (#3502) errors if trying to use typeof in alias errors if trying to use typeof in alias errors if declares alias inside if errors if declares alias inside if resolves type through alias (#563) resolves type through alias (#563) reopens class through alias within itself reopens class through alias within itself can pass recursive alias to proc can pass recursive alias to proc finds type through alias (#4645) finds type through alias (#4645) resolves alias type resolves alias type inherits class through alias inherits class through alias reopens module through alias reopens module through alias uses constant in alias with math (#3259) uses constant in alias with math (#3259) Codegen: extern struct declares extern union, sets and gets instance var declares extern union, sets and gets instance var invokes proc with extern struct invokes proc with extern struct 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 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 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 invokes proc with extern struct with sret invokes proc with extern struct with sret codegens proc that takes and returns large extern struct by value codegens proc that takes and returns large extern struct by value declares extern union with no constructor declares extern union with no constructor doesn't crash with proc with extern struct that's a closure doesn't crash with proc with extern struct that's a closure declares extern struct with no constructor declares extern struct with no constructor codegens extern proc call twice (#4982) codegens extern proc call twice (#4982) codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret codegens proc that takes and returns an extern struct with sret 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 an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil codegens proc that takes an extern struct with C ABI, callback returns nil declares extern struct with no constructor, assigns var declares extern struct with no constructor, assigns var codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes and returns an extern struct with C ABI codegens proc that takes an extern struct with C ABI (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: special vars infers when assigning inside block infers when assigning inside 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 infers in block infers in block types $~ when not defined as no return (2) types $~ when not defined as no return (2) infers after block infers after block types $? when not defined as no return (2) types $? when not defined as no return (2) errors if assigning $~ at top level errors if assigning $~ at top level infers $? infers $? errors if assigning $? at top level errors if assigning $? at top level infers $~ infers $~ infers in block with nested block infers in block with nested block Semantic: concrete_types VirtualMetaclassType with concrete base VirtualMetaclassType with concrete base VirtualType with abstract base VirtualType with abstract base VirtualType with concrete base VirtualType with concrete base ModuleType ModuleType UnionType of structs UnionType of structs VirtualMetaclassType with abstract base VirtualMetaclassType with abstract base GenericModuleInstanceType GenericModuleInstanceType Semantic: array types non-empty typed array literal of int types non-empty typed array literal of int types array literal with splats types array literal with splats types empty typed array literal of int32 types empty typed array literal of int32 types array literal of union types array literal of union assignment in array literal works (#3195) assignment in array literal works (#3195) types array literal of int types array literal of int types non-empty typed array literal of int types non-empty typed array literal of int types array literal size correctly types array literal size correctly types array literal of int with splats types array literal of int with splats types array literal with splats (2) types array literal with splats (2) Semantic: macro errors if declares macro inside if errors if declares macro inside if begins with {{ yield }} (#15050) begins with {{ yield }} (#15050) errors if missing two arguments errors if missing two arguments shows correct error message in macro expansion (#7083) shows correct error message in macro expansion (#7083) finds generic type argument of included module finds generic type argument of included module errors if named arg matches splat parameter errors if named arg matches splat parameter errors if applying protected modifier to macro errors if applying protected modifier to macro allows subclasses of return type for macro def allows subclasses of return type for macro def checks if macro expansion returns (#821) checks if macro expansion returns (#821) can lookup type parameter when macro is called inside class (#5343) can lookup type parameter when macro is called inside class (#5343) errors if named arg matches single splat parameter errors if named arg matches single splat parameter allows union return types for macro def allows union return types for macro def evaluates yield expression (#2924) evaluates yield expression (#2924) can access variable inside macro expansion (#2057) can access variable inside macro expansion (#2057) transforms with {{yield}} and call transforms with {{yield}} and call finds metaclass instance of instance method (#4739) finds metaclass instance of instance method (#4739) finds macro through alias (#2706) finds macro through alias (#2706) finds free type vars finds free type vars says missing argument because positional args don't match past splat says missing argument because positional args don't match past splat allows declaring class with macro if allows declaring class with macro if declares variable for macro with out declares variable for macro with out finds var in proc for macros finds var in proc for macros expands macro with block expands macro with block clones default value before expanding clones default value before expanding declares rescue variable inside for macro declares rescue variable inside for macro can return class type in macro def can return class type in macro def finds generic in macro code using free var finds generic in macro code using free var finds macro in inherited generic class finds macro in inherited generic class has correct location after expanding assignment after instance var has correct location after expanding assignment after instance var errors if macro def type not found errors if macro def type not found allows specifying self as macro def return type (2) allows specifying self as macro def return type (2) finds macro in included generic module finds macro in included generic module types macro def with argument types macro def with argument finds generic type argument of included module with self finds generic type argument of included module with self can override macro (#2773) can override macro (#2773) can return virtual class type in macro def can return virtual class type in macro def solves macro expression arguments before macro expansion (constant) solves macro expression arguments before macro expansion (constant) finds macro in module in Object finds macro in module in Object @caller returns nil if no stack is available returns nil if no stack is available provides access to the `Call` information provides access to the `Call` information returns an array of each call returns an array of each call doesn't error when adding macro call to constant (#2457) doesn't error when adding macro call to constant (#2457) applies visibility modifier only to first level applies visibility modifier only to first level unpacks block parameters inside macros (#13742) unpacks block parameters inside macros (#13742) types macro def that calls another method inside a class types macro def that calls another method inside a class allows generic return types for macro def allows generic return types for macro def types macro types macro raise inside method without node renders both frames (#7147) renders both frames (#7147) inside macro without node does not contain `expanding macro` does not contain `expanding macro` renders both frames (#7147) renders both frames (#7147) supports an empty message (#8631) supports an empty message (#8631) with node renders both frames (#7147) renders both frames (#7147) points to caller when missing node location information (#7147) points to caller when missing node location information (#7147) 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) types macro def that calls another method inside a class types macro def that calls another method inside a class matches with default value after splat matches with default value after splat double splat and regular args double splat and regular args errors if macro uses undefined variable errors if macro uses undefined variable finds macro and method at the same scope inside included module finds macro and method at the same scope inside included module executes MultiAssign with ArrayLiteral value executes MultiAssign with ArrayLiteral value errors when trying to define def inside def with macro expansion errors when trying to define def inside def with macro expansion errors if named arg already specified errors if named arg already specified errors if find macros but missing argument errors if find macros but missing argument can't define new variables (#466) can't define new variables (#466) executes OpAssign (#9356) executes OpAssign (#9356) uses bare *, doesn't let more args uses bare *, doesn't let more args 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 declares multi-assign vars for macro declares multi-assign vars for macro works inside proc literal (#2984) works inside proc literal (#2984) errors if macro def type doesn't match found errors if macro def type doesn't match found expands macro with block and argument to yield expands macro with block and argument to yield 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) finds macro in included module finds macro in included module does macro verbatim outside macro does macro verbatim outside macro doesn't die on && inside if (bug) doesn't die on && inside if (bug) executes MultiAssign executes MultiAssign doesn't affect self restrictions outside the macro def being instantiated in subtypes doesn't affect self restrictions outside the macro def being instantiated in subtypes finds macro and method at the same scope finds macro and method at the same scope uses uninitialized variable with macros uses uninitialized variable with macros errors if missing one argument errors if missing one argument uses bare * uses bare * looks up argument types in macro owner, not in subclass (#2395) looks up argument types in macro owner, not in subclass (#2395) finds method before macro (#236) finds method before macro (#236) show macro trace in errors (1) show macro trace in errors (1) allows named args after splat allows named args after splat finds macro in included module at class level (#4639) finds macro in included module at class level (#4639) solves macro expression arguments before macro expansion (type) solves macro expression arguments before macro expansion (type) allows declaring class with inline macro expression (#1333) allows declaring class with inline macro expression (#1333) finds metaclass instance of instance method (#4639) finds metaclass instance of instance method (#4639) can define constant via macro included can define constant via macro included can use macro in instance var initializer (just assignment) (#7666) can use macro in instance var initializer (just assignment) (#7666) cannot lookup type defined in caller class cannot lookup type defined in caller class finds generic in macro code finds generic in macro code expands macro with break inside while (#1852) expands macro with break inside while (#1852) does macro verbatim inside macro does macro verbatim inside macro gives precise location info when doing yield inside macro gives precise location info when doing yield inside macro errors if using macro that is defined later errors if using macro that is defined later doesn't include parameters with default values in missing arguments error doesn't include parameters with default values in missing arguments error errors if requires inside if through macro expansion errors if requires inside if through macro expansion 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) allows specifying self as macro def return type allows specifying self as macro def return type errors if non-existent named arg errors if non-existent named arg types macro def that calls another method types macro def that calls another method show macro trace in errors (2) show macro trace in errors (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 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 uses splat and double splat uses splat and double splat can specify tuple as return type can specify tuple as return type solves named macro expression arguments before macro expansion (type) (#2423) solves named macro expression arguments before macro expansion (type) (#2423) assigns to underscore in MultiAssign assigns to underscore in MultiAssign can use macro in instance var initializer (#7666) can use macro in instance var initializer (#7666) finds type for global path shared with free var finds type for global path shared with free var uses bare *, doesn't let more args uses bare *, doesn't let more args errors if requires inside class through macro expansion errors if requires inside class through macro expansion unpacks to underscore within block parameters inside macros unpacks to underscore within block parameters inside macros gets named arguments in double splat gets named arguments in double splat assigns to underscore assigns to underscore allows declaring class with macro for allows declaring class with macro for types macro def types macro def doesn't crash on syntax error inside macro (regression, #8038) doesn't crash on syntax error inside macro (regression, #8038) errors if find macros but wrong arguments errors if find macros but wrong arguments Semantic: return allows nilable return type to match subclasses (#1735) allows nilable return type to match subclasses (#1735) can use type var as return type (#1226) can use type var as return type (#1226) infers return type infers return type can use non-type free var in return type (#6543) can use non-type free var in return type (#6543) can use non-type free var in return type (2) (#6543) can use non-type free var in return type (2) (#6543) types return if true types return if true can use type var as return type with an inherited generic class can use type var as return type with an inherited generic class can use free var in return type (#2492) can use free var in return type (#2492) forms a tuple from multiple return values forms a tuple from multiple return values types bug (#1823) types bug (#1823) errors if non-type free var cannot be inferred errors if non-type free var cannot be inferred infers return type with many returns (1) infers return type with many returns (1) allows returning NoReturn instead of the wanted type allows returning NoReturn instead of the wanted type errors on return in top level errors on return in top level flattens splats inside multiple return values flattens splats inside multiple return values can use type var as return type with an included generic module can use type var as return type with an included generic module doesn't confuse return type from base class doesn't confuse return type from base class infers return type with many returns (2) infers return type with many returns (2) Crystal::Repl::Interpreter classes does allocate, set instance var and get instance var does allocate, set instance var and get instance var discards allocate discards allocate does constructor does constructor does object_id does object_id interprets read instance var interprets read instance var calls explicit struct self method calls explicit struct self method calls implicit class self method calls implicit class self method calls implicit struct self method calls implicit struct self method downcasts virtual type to its only type (#12351) downcasts virtual type to its only type (#12351) inlines instance var access from virtual type with a single type (#39520) inlines instance var access from virtual type with a single type (#39520) Code gen: hooks does finished does finished does extended macro does extended macro does inherited macro does inherited macro does included macro does included macro does inherited macro recursively does inherited macro recursively 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 fixes empty types in hooks (#3946) fixes empty types in hooks (#3946) Crystal::Repl::Interpreter class vars interprets class var for virtual metaclass type interprets class var for virtual metaclass type does class var initializer with union (#12633) does class var initializer with union (#12633) 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 with initializer interprets class var with initializer interprets class var for virtual type interprets class var for virtual type interprets class var without initializer interprets class var without initializer View#module_name hyphen followed by non-ascii letter is replaced by its character hyphen followed by non-ascii letter is replaced by its character underscore is ignored underscore is ignored namespace is divided by hyphen namespace is divided by hyphen Codegen: fun sets external linkage by default sets external linkage by default defines same fun 3 or more times (#15523) defines same fun 3 or more times (#15523) sets internal linkage to __crystal_ funs when compiling to single module sets internal linkage to __crystal_ funs when compiling to single module Code gen: c enum codegens enum value 2 codegens enum value 2 codegens enum with 3 &- 2 codegens enum with 3 &- 2 codegens enum with 10 // 2 codegens enum with 10 // 2 codegens enum with (1 + 2) * 3 codegens enum with (1 + 2) * 3 codegens enum with ~1 codegens enum with ~1 codegens enum with +1 codegens enum with +1 codegens enum with 10 | 3 codegens enum with 10 | 3 codegens enum that refers to another constant codegens enum that refers to another constant codegens enum with 3 * 2 codegens enum with 3 * 2 codegens enum with 10 & 3 codegens enum with 10 & 3 codegens enum value 3 codegens enum value 3 codegens enum with 10 % 3 codegens enum with 10 % 3 codegens enum that refers to another enum constant codegens enum that refers to another enum constant codegens enum with 1 + 2 codegens enum with 1 + 2 codegens enum with 3 &* 2 codegens enum with 3 &* 2 codegens enum value codegens enum value codegens enum with -1 codegens enum with -1 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 1 &+ 2 codegens enum with 1 &+ 2 codegens enum value 4 codegens enum value 4 codegens enum with 100 >> 3 codegens enum with 100 >> 3 Normalize: until normalizes until normalizes until Normalize: case normalizes case with multiple expressions and non-tuple normalizes case with multiple expressions and non-tuple normalizes case without value with many expressions in when normalizes case without value with many expressions in when normalizes case with nil to is_a? normalizes case with nil to is_a? normalizes case with call normalizes case with call normalizes case without value normalizes case without value normalizes case with Path to is_a? normalizes case with Path to is_a? normalizes case with implicit ! normalizes case with implicit ! normalizes case without when but else normalizes case without when but else normalizes case with multiple expressions and types normalizes case with multiple expressions and types normalizes case with Path.class to is_a? normalizes case with Path.class to is_a? normalizes case with multiple expressions and implicit obj normalizes case with multiple expressions and implicit obj 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 Generic.class to is_a? normalizes case with Generic.class to is_a? normalizes case with var in cond normalizes case with var in cond normalizes case without cond, when and else normalizes case without cond, when and else normalizes case with many expressions in when normalizes case with many expressions in when normalizes case with implicit as (#3040) normalizes case with implicit as (#3040) normalizes case without when and else normalizes case without when and else normalizes case with multiple expressions normalizes case with multiple expressions normalizes case with generic to is_a? normalizes case with generic to is_a? normalizes case with implicit call normalizes case with implicit call normalizes case with Path.class to is_a? (in) normalizes case with Path.class to is_a? (in) normalizes case with multiple expressions with all underscores twice normalizes case with multiple expressions with all underscores twice normalizes case with multiple expressions with all underscores normalizes case with multiple expressions with all underscores normalizes case with implicit responds_to? (#3040) normalizes case with implicit responds_to? (#3040) normalizes case with multiple expressions and comma normalizes case with multiple expressions and comma normalizes case with multiple expressions with underscore normalizes case with multiple expressions with underscore normalizes case without cond, when but else normalizes case without cond, when but else normalizes case with assignment normalizes case with assignment normalizes case with assignment wrapped by paren normalizes case with assignment wrapped by paren Crystal::Repl::Interpreter special vars sets special var inside call inside block (#12250) sets special var inside call inside block (#12250) does special var that's a struct does special var that's a struct 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 inside block does special var that's a reference inside block does special var that's a reference does special var that's a reference does special var that's a reference for multidispatch does special var that's a reference for multidispatch Semantic: fun errors if defining class inside fun through macro (#6874) errors if defining class inside fun through macro (#6874) Crystal::Doc::Method args_to_s shows args and return type restriction shows args and return type restriction shows external name of arg with quotes and escaping shows external name of arg with quotes and escaping shows default value of arg with highlighting shows default value of arg with highlighting shows splat args shows splat args shows block args if a def has `yield` shows block args if a def has `yield` shows typeof restriction of arg with highlighting shows typeof restriction of arg with highlighting shows underscore restriction shows underscore restriction shows block args shows block args shows return type restriction shows return type restriction shows simple args shows simple args shows double splat args shows double splat args shows external name of arg shows external name of arg shows block args with underscore shows block args with underscore doc inherits doc from ancestor (no extra comment) inherits doc from ancestor (no extra comment) trailing comment is not a doc comment trailing comment is not a doc comment gets doc from underlying method gets doc from underlying method trailing comment is not part of a doc comment trailing comment is not part of a doc comment inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit:) inherits doc from ancestor (use :inherit: plus more content) inherits doc from ancestor (use :inherit: plus more content) inherits doc from previous def (no extra comment) inherits doc from previous def (no extra comment) Code gen: hash literal spec creates custom generic hash via alias (2) creates custom generic hash via alias (2) creates custom generic hash with type vars creates custom generic hash with type vars assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works assignment in hash-like literal works creates custom generic hash creates custom generic hash creates custom non-generic hash in module creates custom non-generic hash in module creates custom generic hash in module (#5684) creates custom generic hash in module (#5684) assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works assignment in hash literal works creates custom non-generic hash creates custom non-generic hash creates custom generic hash via alias (1) creates custom generic hash via alias (1) 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) Code gen: new evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) overloads new and initialize, 2 (#2489) overloads new and initialize, 2 (#2489) finds new in superclass if no initialize is defined (1) finds new in superclass if no initialize is defined (1) codegens instance method with allocate codegens instance method with allocate finds new in superclass for Enum finds new in superclass for Enum codegens instance method with new codegens instance method with 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 can create Tuple with Tuple.new evaluates initialize default value at the instance scope (4) (#731) evaluates initialize default value at the instance scope (4) (#731) codegens instance method with new and instance var codegens instance method with new and instance var finds super in deep hierarchy finds super in deep hierarchy inherits initialize inherits initialize inherits initialize for generic type inherits initialize for generic type evaluates initialize default value at the instance scope (2) (#731) evaluates initialize default value at the instance scope (2) (#731) finds new in superclass if no initialize is defined (2) finds new in superclass if no initialize is defined (2) defines new for module defines new for module can create Reference can create Reference overloads new and initialize, 3 (#2489) overloads new and initialize, 3 (#2489) overloads new and initialize, 1 (#2489) overloads new and initialize, 1 (#2489) Codegen: thread local 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 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 Semantic: did you mean says did you mean finds most similar in def says did you mean finds most similar in def says did you mean for nested class says did you mean for nested class says did you mean for global method without parenthesis says did you mean for global method without parenthesis says did you mean finds most similar in type says did you mean finds most similar in type says did you mean for one mistake in short word in instance method says did you mean for one mistake in short word in instance method doesn't suggest when declaring var 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 named argument says did you mean for named argument says did you mean for instance var in subclass says did you mean for instance var in subclass says did you mean for variable says did you mean for variable 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 two mistakes in long word in instance method says did you mean for two mistakes in long word in instance method says did you mean in instance var declaration says did you mean in instance var declaration 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 suggest that there might be a typo for an initialize method with overload suggest that there might be a typo for an initialize method with overload doesn't suggest when declaring var inside macro (#466) doesn't suggest when declaring var inside macro (#466) doesn't suggest for operator doesn't suggest for operator suggests a better alternative to logical operators (#2715) suggests a better alternative to logical operators (#2715) suggests for class variable suggests for class variable says did you mean for nested class via alias says did you mean for nested class via alias 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 global method with parenthesis says did you mean for global method with parenthesis 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 produces valid yaml file produces valid yaml file doesn't error when asked to skip existing files doesn't error when asked to skip existing files errors if files will be overwritten by a generated file errors if files will be overwritten by a generated file honors the custom set directory name honors the custom set directory name Codegen: class var gets pointerof class var gets pointerof class var 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 simple class var before another complex one reads simple class var before another complex one codegens class var codegens class var 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 codegens class var as nil codegens class var as nil codegens class var with type declaration begin and vars codegens class var with type declaration begin and vars reads class var from virtual type metaclass reads class var from virtual type metaclass 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 doesn't inherit class var value in subclass doesn't inherit class var value in subclass codegens class var inside module codegens class var inside module initializes 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 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 declares var as uninitialized and initializes it unsafely declares var as uninitialized and initializes it unsafely 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 doesn't use nilable type for initializer doesn't use nilable type for initializer gets pointerof class var complex constant gets pointerof class var complex constant catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer catch infinite loop in class var initializer codegens class var with nilable reference type codegens class var with nilable reference type codegens class var with begin and vars codegens class var with begin and vars inline initialization of simple class var inline initialization of simple 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) writes class var from virtual type writes class var from virtual type codegens second class var initializer codegens second class var initializer codegens generic class with class var codegens generic class with class var codegens class var inside instance method codegens class var inside instance method declares and initializes declares and initializes uses var in class var initializer uses var in class var initializer doesn't inherit class var value in module doesn't inherit class var value in module reads class var before initializing it (hoisting) reads class var before initializing it (hoisting) initializes class var of union with single type initializes class var of union with single type reads class var from virtual type reads class var from virtual type accesses class var from proc literal accesses class var from proc literal Crystal::Playground::Session assert assert implementations find const implementation find const implementation find implementation in class methods find implementation in class methods find full trace for macro expansions find full trace for macro expansions find implementation inside contained file private method find implementation inside contained file private method find struct implementation find struct implementation find module implementation find module implementation find method calls inside while find method calls inside while find implementors of different classes find implementors of different classes find implementation inside contained file private class' class method find implementation inside contained file private class' class method find implementors of classes that are only used find implementors of classes that are only used find method calls inside rescue find method calls inside rescue find implementation from macro expansions find implementation from macro expansions find top level method calls find top level method calls find method calls inside if find method calls inside if find class defined by macro find class defined by macro find method calls inside while cond find method calls inside while cond find alias implementation find alias implementation find class implementation find class implementation find implementation inside contained class' class method find implementation inside contained class' class method can display json output can display json output find enum implementation find enum implementation find implementation on def with no location find implementation on def with no location find enum value implementation find enum value implementation find method calls inside trailing if find method calls inside trailing if find implementation inside a module class find implementation inside a module class find implementation in generic class methods find implementation in generic class methods find class inside method find class inside method find open class implementation find open class implementation can display text output can display text output find implementation in generic class find implementation in generic class Semantic: enum reopens enum with same base type (2) reopens enum with same base type (2) reopens enum without base type (1) reopens enum without base type (1) 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) creates enum from value creates enum from value allows class vars in enum allows class vars in enum finds method in enum type finds method in enum type doesn't error when defining a non-flags enum with None or All doesn't error when defining a non-flags enum with None or All errors if enum value is too big for type (#678) errors if enum value is too big for type (#678) errors if using instance var inside enum (#991) errors if using instance var inside enum (#991) defines class method on enum defines class method on enum errors if using a name twice errors if using a name twice disallows All value for @[Flags] enum disallows All value for @[Flags] enum gives error on enum overflow gives error on enum overflow errors if defining initialize in Enum (#7238) errors if defining initialize in Enum (#7238) disallows implicit conversion of int to enum disallows implicit conversion of int to enum allows redefining None to 0 for @[Flags] enum allows redefining None to 0 for @[Flags] enum 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 on enum without members (#3447) errors on enum without members (#3447) attaches annotation to enum method (#6690) attaches annotation to enum method (#6690) can use macro for inside enum can use macro for inside enum defines method on enum defines method on enum reopens an enum reopens an enum doesn't visit enum members generated by macros twice (#10104) doesn't visit enum members generated by macros twice (#10104) gives error on enum overflow after a member with value gives error on enum overflow after a member with value types enum value types enum value gives error on flags enum overflow gives error on flags enum overflow errors if reopen but not enum errors if reopen but not enum doesn't overflow when going from negative to zero (#7874) doesn't overflow when going from negative to zero (#7874) reopens enum with same base type (1) reopens enum with same base type (1) can redefine Enum.new can redefine Enum.new doesn't overflow on flags member (#7877) doesn't overflow on flags member (#7877) errors if declaring type inside enum (#3127) errors if declaring type inside enum (#3127) finds class method in enum type finds class method in enum type has None value when defined as @[Flags] has None value when defined as @[Flags] errors if reopen and tries to define constant errors if reopen and tries to define constant disallows redefining None to non-0 for @[Flags] enum disallows redefining None to non-0 for @[Flags] enum errors if reopening enum with different base type (2) errors if reopening enum with different base type (2) errors if invoking private enum method errors if invoking private enum method marks helper methods with `:nodoc:` if the member is `:nodoc:` marks helper methods with `:nodoc:` if the member is `:nodoc:` types enum types enum doesn't error when defining a method for an enum with flags doesn't error when defining a method for an enum with flags reopens enum without base type (2) reopens enum without base type (2) errors if declaring type inside enum, nested (#3127) errors if declaring type inside enum, nested (#3127) errors if inheriting Enum (#3592) errors if inheriting Enum (#3592) gives error on unsigned flags enum overflow after a member with value gives error on unsigned flags enum overflow after a member with value has All value when defined as @[Flags] has All value when defined as @[Flags] 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 adds docs to helper methods adds docs to helper methods can use macro expression inside enum can use macro expression inside enum errors if reopening enum with different base type (1) errors if reopening enum with different base type (1) marks as flags with base type (#2185) marks as flags with base type (#2185) Code gen: c union reads union instance var reads union instance var automatically converts numeric type in field assignment automatically converts numeric type in field assignment codegens struct inside union codegens struct inside union codegens union property setter 1 via pointer codegens union property setter 1 via pointer codegens assign c union to union codegens assign c union to union 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 fills union type to the max size fills union type to the max size 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 automatically converts numeric union type in field assignment automatically converts numeric union type in field assignment codegens union property default value codegens union property default value codegens union property default value 2 codegens union property default value 2 automatically converts by invoking to_unsafe automatically converts by invoking to_unsafe codegens union property setter 2 via pointer codegens union property setter 2 via pointer builds union setter with fun type builds union setter with fun type aligns to the member with biggest align requirements aligns to the member with biggest align requirements codegens union property setter 2 codegens union property setter 2 Crystal::FFI::CallInterface .new make struct make struct simple call simple call sum struct sum struct with args with args array array all primitive arg types all primitive arg types .variadic validates args size validates args size basic basic zero varargs zero varargs read_file? with absolute path reads file (doesn't exist) reads file (doesn't exist) with relative path reads file (doesn't exist) reads file (doesn't exist) Semantic: private doesn't find private constant from outside namespace, long name (#8831) doesn't find private constant from outside namespace, long name (#8831) doesn't find private enum from outside namespace doesn't find private enum from outside namespace doesn't define private lib with global type name doesn't define private lib with global type name find module private macro inside a module, which is inherited by the module find module private macro inside a module, which is inherited by the module doesn't find private alias from outside namespace, long name (#8831) doesn't find private alias from outside namespace, long name (#8831) doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) doesn't find private def in another file doesn't find private def in another file doesn't find private macro defined through macro (#8715) doesn't find private macro defined through macro (#8715) doesn't find private constant in another file (#7850) doesn't find private constant in another file (#7850) types private def correctly types private def correctly doesn't define private enum with global type name doesn't define private enum with global type name doesn't find private alias from outside namespace doesn't find private alias 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 inherit visibility from class node in macro hook (#8794) doesn't inherit visibility from class node in macro hook (#8794) doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) finds private class in macro expansion finds private class in macro expansion finds private def in same file that invokes another def finds private def in same file that invokes another def doesn't find private constant from outside namespace doesn't find private constant from outside namespace doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) gives private constant error in macro gives private constant error in macro finds private def when invoking from inside macro (#2082) finds private def when invoking from inside macro (#2082) can use instance var initializer in private type can use instance var initializer in private type doesn't find private module defined through macro (#8715) doesn't find private module defined through macro (#8715) doesn't define incorrect type in top-level namespace (#13511) doesn't define incorrect type in top-level namespace (#13511) finds private macro in same file finds private macro in same file can use types in private type can use types in private type doesn't define private class with global type name doesn't define private class with global type name finds private def in same file finds private def in same file doesn't find private thing defined through recursive macro (#8715) doesn't find private thing defined through recursive macro (#8715) doesn't define private constant with global type name doesn't define private constant with global type name finds private type from inside namespace in subclass finds private type from inside namespace in subclass 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 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 finds private type from inside namespace finds private type from inside namespace doesn't find private module from outside namespace doesn't find private module from outside namespace doesn't find private macro in another file doesn't find private macro in another file find module private macro inside the module find module private macro inside the module doesn't define private module with global type name doesn't define private module with global type name doesn't find private lib from outside namespace, long name (#8831) doesn't find private lib 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 class defined through macro (#8715) doesn't find private class defined through macro (#8715) doesn't find private class in another file doesn't find private class in another file 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 enum from outside namespace, long name (#8831) doesn't find private enum from outside namespace, long name (#8831) doesn't find private lib from outside namespace doesn't find private lib from outside namespace doesn't find private alias in another file doesn't find private alias 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) finds private type in same file finds private type in same file can use class var initializer in private type can use class var initializer in private type doesn't find module private macro outside the module doesn't find module private macro outside the module Lexer comments lexes without comments enabled lexes without comments enabled lexes with comments enabled (2) lexes with comments enabled (2) lexes with comments enabled lexes with comments enabled lexes correct number of spaces lexes correct number of spaces 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 named arguments, def has bare splat parameter (#8895) types previous def with named arguments, def has bare splat parameter (#8895) types previous def with named arguments, def has bare splat parameter (2) (#8895) types previous def with named arguments, def has bare splat parameter (2) (#8895) types previous def in generic class types previous def in generic class types previous def types previous def types previous def with restrictions types previous def with restrictions types previous def when inside fun types previous def when inside fun 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 when inside fun and forwards args types previous def when inside fun and forwards args types previous def with forwarded arguments, def has bare splat parameter (#8895) types previous def with forwarded arguments, def has bare splat parameter (#8895) types previous def with forwarded arguments, different internal names (#8895) types previous def with forwarded arguments, different internal names (#8895) says wrong number of arguments for previous_def (#1223) says wrong number of arguments for previous_def (#1223) types previous def with explicit arguments types previous def with explicit arguments Crystal::Repl::Interpreter unions put and remove from union in instance var put and remove from union in instance var put and remove from union, together with is_a? (falsey case) put and remove from union, together with is_a? (falsey case) converts from NilableType to NonGenericClassType converts from NilableType to NonGenericClassType put and remove from union in local var put and remove from union in local var discards is_a? discards is_a? returns large union type (#15041) returns large union type (#15041) puts union inside union puts union inside union put and remove from union, together with is_a? (truthy case) put and remove from union, together with is_a? (truthy case) returns union type returns union type Crystal::TextHierarchyPrinter shows correct size for Proc inside extern struct shows correct size for Proc inside extern struct shows correct total size of generic class if known shows correct total size of generic class if known shows correct size for members with bound types shows correct size for members with bound types shows correct size for Bool member shows correct size for Bool member works works shows extern unions shows extern unions Semantic: lib errors if using named args with variadic function errors if using named args with variadic function passes int as another integer type with literal passes int as another integer type with literal types fun returning nil as nil types fun returning nil as nil types fun returning nothing as nil types fun returning nothing as nil errors if CallConvention argument is not a string errors if CallConvention argument is not a string types lib var get types lib var get 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) reports error when changing var type and something breaks reports error when changing var type and something breaks types a varargs external types a varargs external errors if missing arguments errors if missing arguments errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call raises wrong argument type raises wrong argument type errors if dll argument does not end with '.dll' errors if dll argument does not end with '.dll' reports error on typedef type not primitive like reports error on typedef type not primitive like allows passing double splat to LibC fun allows passing double splat to LibC fun error if passing type to LibC with to_unsafe but type doesn't match error if passing type to LibC with to_unsafe but type doesn't match errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type correctly attached link flags if there's a macro if correctly attached link flags if there's a macro if errors if missing argument errors if missing argument errors if using unknown named param errors if using unknown named param allows dll argument allows dll argument reports error on fun return type not primitive like reports error on fun return type not primitive like reports error on fun argument type not primitive like reports error on fun argument type not primitive like errors if unknown named arg errors if unknown named arg specifies a call convention to a lib specifies a call convention to a lib clears annotations after lib clears annotations after lib reopens lib and adds more link annotations reopens lib and adds more link annotations supports forward references with struct inside struct (#399) supports forward references with struct inside struct (#399) errors if parameter already specified errors if parameter already specified errors if lib fun call is part of dispatch errors if lib fun call is part of dispatch warns if Link annotations use positional arguments warns if Link annotations use positional arguments errors if using void via typedef as parameter (related to #508) errors if using void via typedef as parameter (related to #508) can use macros inside lib can use macros inside lib allows passing splat to LibC fun allows passing splat to LibC fun raises wrong number of arguments raises wrong number of arguments can use named args can use named args errors if lib already specified with positional argument errors if lib already specified with positional argument errors if third argument is not a bool errors if third argument is not a bool supports forward references (#399) supports forward references (#399) reopens lib and adds same link annotations reopens lib and adds same link annotations reports error when changing instance var type and something breaks reports error when changing instance var type and something breaks reports redefinition of fun with different signature reports redefinition of fun with different signature can use macros inside struct can use macros inside struct types lib var set types lib var set errors if fourth argument is not a bool errors if fourth argument is not a bool errors if using void as parameter (related to #508) errors if using void as parameter (related to #508) errors if wrong number of arguments for CallConvention errors if wrong number of arguments for CallConvention passes int as another integer type in variable passes int as another integer type in variable can list lib functions at the top level (#12395) can list lib functions at the top level (#12395) errors if passing void lib call to call argument (#4414) errors if passing void lib call to call argument (#4414) errors if lib named arg is not a String errors if lib named arg is not a String gathers link annotations from macro expression gathers link annotations from macro expression reports error if using out with an already declared variable reports error if using out with an already declared variable errors if too many link arguments errors if too many link arguments passes float as another integer type in variable passes float as another integer type in variable errors if second argument is not a string errors if second argument is not a string errors if redefining fun with different signature (#2468) errors if redefining fun with different signature (#2468) overrides definition of fun overrides definition of fun allows invoking lib call without obj inside lib allows invoking lib call without obj inside lib specifies a call convention specifies a call convention raises on undefined fun raises on undefined fun errors if missing link arguments errors if missing link arguments can use out with named args can use out with named args errors if CallConvention argument is not a valid string errors if CallConvention argument is not a valid string errors if using out with non-pointer errors if using out with non-pointer reports error out can only be used with lib funs reports error out can only be used with lib funs reports error on fun argument type not primitive like, Nil (#2994) reports error on fun argument type not primitive like, Nil (#2994) types lib var get with forward declaration types lib var get with forward declaration errors if using out with varargs errors if using out with varargs errors if using out with void pointer (#2424) errors if using out with void pointer (#2424) errors if defining incompatible funs with the same name in different libs (#3045) errors if defining incompatible funs with the same name in different libs (#3045) errors if first argument is not a string errors if first argument is not a string errors if defines def on lib errors if defines def on lib reports error on struct field type not primitive like reports error on struct field type not primitive like can use tuple as fun return can use tuple as fun return allows invoking out with underscore allows invoking out with underscore error if passing non primitive type as varargs error if passing non primitive type as varargs defined fun with aliased type defined fun with aliased type errors if using out with void pointer through type errors if using out with void pointer through type errors if dll argument contains directory separators errors if dll argument contains directory separators defines lib funs before funs with body defines lib funs before funs with body 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 doesn't try to invoke unsafe for c struct/union (#1362) doesn't try to invoke unsafe for c struct/union (#1362) 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 error if passing non primitive type as varargs invoking to_unsafe error if passing non primitive type as varargs invoking to_unsafe types fun returning void as nil types fun returning void as nil errors if assigning void lib call to var (#4414) errors if assigning void lib call to var (#4414) 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 method of with object uses method of with object 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 yields with dispatch (#2171) (1) yields with dispatch (#2171) (1) doesn't explode if specifying &block but never using it (#181) doesn't explode if specifying &block but never using it (#181) it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope it invokes global method inside block of yield scope uses 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 uses method of enclosing scope uses method of enclosing scope generate right code when yielding struct as scope generate right code when yielding struct as scope uses instance variable of enclosing scope uses instance variable of enclosing scope yields virtual type (#2171) (2) yields virtual type (#2171) (2) Semantic: recursive struct check errors on recursive generic struct inside module errors on recursive generic struct inside module detects recursive generic struct through generic module (#4720) detects recursive generic struct through generic module (#4720) detects recursive struct through module detects recursive struct through module errors on recursive struct through named tuple errors on recursive struct through named tuple errors on recursive abstract struct through module (#11384) errors on recursive abstract struct through module (#11384) errors on recursive struct through tuple errors on recursive struct through tuple detects recursive generic struct through module (#4720) detects recursive generic struct through module (#4720) errors on mutually recursive struct errors on mutually recursive struct detects recursive struct through inheritance (#3071) detects recursive struct through inheritance (#3071) errors on recursive struct through recursive alias (#4454) (#4455) errors on recursive struct through recursive alias (#4454) (#4455) errors on private recursive type errors on private recursive type errors on recursive struct inside module errors on recursive struct inside module errors on recursive struct errors on recursive struct Code gen: if 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 with an else with true codegens if with an else with true codes if with two whiles codes if with two whiles codegens if of nilable type in else 3 codegens if of nilable type in else 3 codegens if without an else with true codegens if without an else with true doesn't crash with if !is_a? using var in then doesn't crash with if !is_a? using var in then codegen if with union type and else without type codegen if with union type and else without type codegens if of nilable type in then codegens if of nilable type in then codegens #3104 codegens #3104 codegens if with nil codegens if with nil 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 doesn't crash no NoReturn var (non-true left cond) (#1823) doesn't crash no NoReturn var (non-true left cond) (#1823) considers or truthy/falsey right considers or truthy/falsey right codegens if with return in both branches codegens if with return in both branches doesn't crash with if !var using var in else doesn't crash with if !var using var in else codegen if inside if codegen if inside if codegen if with union type and then without type codegen if with union type and then without type codegens if without an else with false codegens if without an else with false doesn't generate truthy if branch if doesn't need value (bug) doesn't generate truthy if branch if doesn't need value (bug) codegen if with nested if that returns codegen if with nested if that returns codegens if with an else with false codegens if with an else with false codegens if of nilable type in else codegens if of nilable type in else codegens if with pointer 0x100000000 pointer codegens if with pointer 0x100000000 pointer codegens if with int codegens if with int codegens if with return and no else codegens if with return and no else codegens if value from then codegens if value from then codegens if with virtual codegens if with virtual codegens if of nilable type in then 2 codegens if of nilable type in then 2 codegens nested if with var (ssa bug) codegens nested if with var (ssa bug) 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 bug #1729 codegens bug #1729 codegens if inside def without an else with true codegens if inside def without an else with true Crystal::Repl::Interpreter blocks interprets yield with splat, less block arguments interprets yield with splat, less block arguments interprets yield return value interprets yield return value interprets next inside block (union, through normal exit) interprets next inside block (union, through normal exit) interprets yield with splat (1) interprets yield with splat (1) interprets underscore parameters corresponding to yield arguments with different types + tuple unpacking (#13474) interprets underscore parameters corresponding to yield arguments with different types + tuple unpacking (#13474) interprets block with splat interprets block with splat discards yield expression discards yield expression yields different values to form a union yields different values to form a union clears block local variables when calling block (2) clears block local variables when calling block (2) casts yield expression to block var type (not block arg type) casts yield expression to block var type (not block arg type) interprets next inside block (union, through next) interprets next inside block (union, through next) interprets next inside block interprets next inside block caches method with captured block (#12276) caches method with captured block (#12276) interprets with ... yield interprets with ... yield returns from block returns from block counts with ... yield scope in block args bytesize (#12316) counts with ... yield scope in block args bytesize (#12316) interprets block with args that conflict with a local var interprets block with args that conflict with a local var interprets underscore parameters corresponding to yield arguments with different types (#13474) interprets underscore parameters corresponding to yield arguments with different types (#13474) interprets block with multiple yields interprets block with multiple yields interprets block with both splat and non-splat underscore parameter (#13474) interprets block with both splat and non-splat underscore parameter (#13474) interprets with ... yield with struct interprets with ... yield with struct 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 (#12270) considers block arg without type as having NoReturn type (#12270) interprets yield with splat, block with splat interprets yield with splat, block with splat interprets yield with splat (2) interprets yield with splat (2) interprets break inside block interprets break inside block interprets with ... yield with extra arguments (#12296) interprets with ... yield with extra arguments (#12296) interprets break inside block (union, through normal flow) interprets break inside block (union, through normal flow) interprets yield expression interprets yield expression captures non-closure block captures non-closure block interprets yield with splat, block with splat (#12227) interprets yield with splat, block with splat (#12227) interprets break inside block (union, through break) interprets break inside block (union, through break) considers block arg without type as having NoReturn type (2) (#12270) considers block arg without type as having NoReturn type (2) (#12270) interprets break inside block (union, through return) interprets break inside block (union, through return) interprets yield inside another block interprets yield inside another block interprets simplest block interprets simplest block interprets yield inside def with arguments interprets yield inside def with arguments interprets block with args that conflict with a local var interprets block with args that conflict with a local var Codegen: private codegens class vars of private types with same name (#11620) codegens class vars of private types with same name (#11620) codegens class var of private type with same name as public type (#11620) codegens class var of private type with same name as public type (#11620) codegens private def in same file codegens private def in same file codegens overloaded private def in same file codegens overloaded private def in same file doesn't include filename for private types doesn't include filename for private types Semantic: class types as no return if calling method on abstract generic class (#6996) types as no return if calling method on abstract generic class (#6996) can't reopen as module can't reopen as module errors when creating Number errors when creating Number can invoke method on abstract type without subclasses nor instances can invoke method on abstract type without subclasses nor instances says no overload matches for class new says no overload matches for class new doesn't lookup type in parents' namespaces, and lookups and in program doesn't lookup type in parents' namespaces, and lookups and in program errors if using read-instance-var with non-typed variable errors if using read-instance-var with non-typed variable errors if inherits from module errors if inherits from module reads a virtual type instance var reads a virtual type instance var errors if assigning superclass to declared instance var errors if assigning superclass to declared instance var reports uninitialized constant reports uninitialized constant type def does not reopen type from parent namespace (#11181) type def does not reopen type from parent namespace (#11181) types class inside class types class inside class reports undefined method when method inside a class reports undefined method when method inside a class types Const#new types Const#new types class and subclass as one type types class and subclass as one type correctly types #680 (2) correctly types #680 (2) allows declaring a variable in an initialize and using it allows declaring a variable in an initialize and using it allows defining classes inside modules or classes with :: allows defining classes inside modules or classes with :: allows instantiating generic class with number allows instantiating generic class with number types virtual method of generic class types virtual method of generic class 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 on no method found on abstract class, class method (#2241) errors on no method found on abstract class, class method (#2241) can use short name for top-level type can use short name for top-level type reads an object instance var reads an object instance var reports can't instantiate abstract class on allocate reports can't instantiate abstract class on allocate doesn't lookup new in supermetaclass doesn't lookup new in supermetaclass types class and subclass as one type types class and subclass as one type errors if reopening non-generic class as generic errors if reopening non-generic class as generic correctly types #680 correctly types #680 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) uses self as type var uses self as type var errors if reopening generic class with different splat index (3) errors if reopening generic class with different splat index (3) errors if declares class inside if errors if declares class inside if errors if inheriting Gen(self) and there's no self (#2890) errors if inheriting Gen(self) and there's no self (#2890) errors if reading non-existent ivar errors if reading non-existent ivar says wrong number of arguments for abstract class new (2) says wrong number of arguments for abstract class new (2) doesn't crash on instance variable assigned a proc, and never instantiated (#923) doesn't crash on instance variable assigned a proc, and never instantiated (#923) uses self as type var uses self as type var types self inside method call without obj types self inside method call without obj types as no return if calling method on abstract class with generic subclasses but no instances (#6996) types as no return if calling method on abstract class with generic subclasses but no instances (#6996) inherits Gen(self) (#2890) inherits Gen(self) (#2890) uses number type var in class method uses number type var in class method can mark initialize as private can mark initialize as private errors if inherits from metaclass errors if inherits from metaclass doesn't mark instance variable as nilable if calling another initialize doesn't mark instance variable as nilable if calling another initialize says that instance vars are not allowed in metaclass says that instance vars are not allowed in metaclass can invoke method on abstract generic type with subclasses but no instances can invoke method on abstract generic type with subclasses but no instances does automatic inference of new for generic types does automatic inference of new for generic types hoists instance variable initializer hoists instance variable initializer says wrong number of arguments for abstract class new says wrong number of arguments for abstract class new errors if using underscore in generic class errors if using underscore in generic class inherits self (#2890) inherits self (#2890) errors if reading ivar from non-ivar container errors if reading ivar from non-ivar container can't reopen as struct can't reopen as struct types Const#allocate types Const#allocate errors if creating instance before typing instance variable errors if creating instance before typing instance variable types Const#new#method types Const#new#method reports undefined instance method reports undefined instance method types type var union types type var union can invoke method on abstract generic type without subclasses nor instances can invoke method on abstract generic type without subclasses nor instances doesn't mix classes on definition (#2352) doesn't mix classes on definition (#2352) types recursive type types recursive type errors when wrong arguments for new errors when wrong arguments for new inherits self twice (#5495) inherits self twice (#5495) doesn't use initialize from base class doesn't use initialize from base class errors when creating Value errors when creating Value reads an object instance var from a union type reads an object instance var from a union type errors if reopening generic class with different splat index errors if reopening generic class with different splat index types instance variable types instance variable infers generic type after instance was created with explicit type infers generic type after instance was created with explicit type doesn't crash with top-level initialize (#2601) doesn't crash with top-level initialize (#2601) doesn't error on new on abstract virtual type class doesn't error on new on abstract virtual type class reports can't instantiate abstract class on new reports can't instantiate abstract class on new errors if reopening generic class with different type vars (2) errors if reopening generic class with different type vars (2) 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 abstract class with all abstract subclasses (#6996) types as no return if calling method on abstract class with all abstract subclasses (#6996) doesn't use initialize from base class with virtual type doesn't use initialize from base class with virtual type types instance variable types instance variable does automatic type inference of new for generic types 2 does automatic type inference of new for generic types 2 does automatic type inference of new for nested generic type does automatic type inference of new for nested generic type types instance variable on getter types instance variable on getter reports wrong number of arguments for initialize reports wrong number of arguments for initialize errors if reopening generic class with different type vars errors if reopening generic class with different type vars finds in global scope if includes module finds in global scope if includes module errors if reopening generic class with different splat index (2) errors if reopening generic class with different splat index (2) can't use implicit initialize if defined in parent can't use implicit initialize if defined in parent reports superclass mismatch reports superclass mismatch reports unknown class when extending reports unknown class when extending preserves order of instance vars (#3050) preserves order of instance vars (#3050) types generic of generic type types generic of generic type Semantic: const 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 nested constant types a nested constant doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') doesn't errors if constant depends on another one defined later through method, but constant is simple ('a') doesn't 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 (ZED - 1) doesn't errors if constant depends on another one defined later through method, but constant is simple (ZED - 1) errors if can't infer constant type (#3240, #3948) errors if can't infer constant type (#3240, #3948) finds constant in module that includes module (#205) finds constant in module that includes module (#205) finds const from restriction finds const from restriction types a constant inside a def types a constant inside a def doesn't error if using c enum doesn't error if using c enum types a global constant reference in method types a global constant reference in method errors if using const in type declaration errors if using const in type declaration types a constant reference types a constant reference errors if using return inside constant value (#5391) errors if using return inside constant value (#5391) finds current type only for first path item (2) finds current type only for first path item (2) types a constant types a constant errors if using constant as generic type (#3240) errors if using constant as generic type (#3240) errors if using const in proc notation return type errors if using const in proc notation return type doesn't errors if constant depends on another one defined later through method, but constant is simple (~ 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 (+ 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) types a constant using Path types a constant using Path doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (- 2) errors on dynamic constant assignment inside block errors on dynamic constant assignment inside block errors on dynamic constant assignment inside if errors on dynamic constant assignment inside if doesn't share variables with global scope doesn't share variables with global scope types a nested type with same name types a nested type with same name keeps type of container when using Path keeps type of container when using Path types a nested constant using Path types a nested constant using Path doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + 2) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + 2) finds current type first finds current type first finds nearest constant first finds nearest constant first errors if using const in proc notation parameter type errors if using const in proc notation parameter type 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) types a global constant reference in static method types a global constant reference in static method 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) can use constant defined later (#2906) can use constant defined later (#2906) doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") doesn't errors if constant depends on another one defined later through method, but constant is simple ("foo") 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 (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 (nil) doesn't errors if constant depends on another one defined later through method, but constant is simple (nil) errors if constant has NoReturn type (#6139) errors if constant has NoReturn type (#6139) doesn't errors if constant depends on another one defined later through method, but constant is simple (1) doesn't errors if constant depends on another one defined later through method, but constant is simple (1) errors if using const in var declaration errors if using const in var declaration 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) finds constant in class that extends class (#205) finds constant in class that extends class (#205) errors if using const in restriction errors if using const in restriction finds current type only for first path item (1) finds current type only for first path item (1) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) doesn't errors if constant depends on another one defined later through method, but constant is simple (1 + ZED) errors if using const in uninitialized errors if using const in uninitialized 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) Codegen: is_a? restricts type in else but lazily restricts type in else but lazily restricts union metaclass to metaclass (#12295) restricts union metaclass to metaclass (#12295) 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) does is_a? with generic class metaclass does is_a? with generic class metaclass codegens is_a? with union gives true codegens is_a? with union gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true codegens is_a? with a Const does comparison and gives true says true for Class.is_a?(Class.class.class) (#4374) says true for Class.is_a?(Class.class.class) (#4374) codegens is_a? with nilable gives false because no type codegens is_a? with nilable gives false because no type works with inherited generic class against an instantiation works with inherited generic class against an instantiation says false for value.is_a?(Class) says false for value.is_a?(Class) codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used codegens when is_a? is always false but properties are used does is_a? with more strict virtual type does is_a? with more strict virtual type 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 nilable gives false because no type codegens is_a? with nilable gives false because no type 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) doesn't type merge (2) (#548) doesn't type merge (2) (#548) codegens is_a? false for simple type codegens is_a? false for simple type does is_a? with && and true condition does is_a? with && and true condition does is_a? for union of module and type does is_a? for union of module and type restricts virtual metaclass against virtual metaclass type restricts virtual metaclass against virtual metaclass type codegens is_a? true for simple type codegens is_a? true for simple type 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 evaluates method on filtered union type evaluates method on filtered union type evaluates method on filtered union type 2 evaluates method on filtered union type 2 does is_a?(generic type) for nested generic inheritance (1) (#9660) does is_a?(generic type) for nested generic inheritance (1) (#9660) codegens is_a? from nilable reference union type to type codegens is_a? from nilable reference union type to type doesn't consider generic type to be a generic type of a recursive alias (#3524) doesn't consider generic type to be a generic type of a recursive alias (#3524) codegens is_a? casts union to nilable in method codegens is_a? casts union to nilable in method doesn't error if result is discarded (#14113) doesn't error if result is discarded (#14113) 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 codegens is_a? with nilable gives true codegens is_a? with nilable gives true evaluate method on filtered type nilable type nil evaluate method on filtered type nilable type nil passes is_a? with generic module type on virtual type (#10302) passes is_a? with generic module type on virtual type (#10302) codegens is_a? from nilable reference union type to nil codegens is_a? from nilable reference union type to nil does is_a?(generic type) for nested generic inheritance, through upcast (2) does is_a?(generic type) for nested generic inheritance, through upcast (2) resets truthy state after visiting nodes (bug) resets truthy state after visiting nodes (bug) gives false if generic type doesn't match exactly gives false if generic type doesn't match exactly 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) codegens is_a? from virtual type to module codegens is_a? from virtual type to module evaluate method on filtered type nilable type not-nil evaluate method on filtered type nilable type not-nil 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? with nilable gives false because other type 2 codegens is_a? with nilable gives false because other type 2 codegens is_a? with union gives false codegens is_a? with union gives false transforms else if condition is always falsey transforms else if condition is always falsey does is_a?(generic type) for nested generic inheritance (2) does is_a?(generic type) for nested generic inheritance (2) codegens is_a? with union gives false codegens is_a? with union gives false codegens is_a? with union gives true codegens is_a? with union gives true restricts simple type with union restricts simple type with union evaluate method on filtered type evaluate method on filtered type doesn't work with inherited generic class against an instantiation (2) doesn't work with inherited generic class against an instantiation (2) does is_a?(generic type) for nested generic inheritance, through upcast (1) does is_a?(generic type) for nested generic inheritance, through upcast (1) does is_a?/responds_to? twice (#1451) does is_a?/responds_to? twice (#1451) 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? 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? with union type, don't resolve to virtual type (#10244) does is_a? with union type, don't resolve to virtual type (#10244) says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) says false for GenericChild(Base).is_a?(GenericBase(Child)) (#1294) says true for Class.is_a?(Class.class) (#4374) says true for Class.is_a?(Class.class) (#4374) codegens is_a? with nilable gives false because other type 1 codegens is_a? with nilable gives false because other type 1 transforms then if condition is always truthy transforms then if condition is always truthy codegens is_a? with virtual and nil codegens is_a? with virtual and nil codegens is_a? with virtual and module codegens is_a? with virtual and module restricts union with union restricts union with union does is_a? for virtual generic instance type against generic does is_a? for virtual generic instance type against generic 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) doesn't type merge (1) (#548) doesn't type merge (1) (#548) restricts metaclass against virtual metaclass type restricts metaclass against virtual metaclass type codegens is_a? with virtual codegens is_a? with virtual codegens is_a? casts union to nilable codegens is_a? casts union to nilable codegens is_a? on right side of and codegens is_a? on right side of and virtual metaclass type is not virtual instance type (#12628) virtual metaclass type is not virtual instance type (#12628) expand expands macro expression {{ ... }} with cursor inside it expands macro expression {{ ... }} with cursor inside it expands macro expression inside def expands macro expression inside def expands macro expression inside private lib expands macro expression inside private lib expands complex macro expands complex macro expands macro control {% for %} expands macro control {% for %} expands macro expression inside C union expands macro expression inside C union expands macro expression inside private class expands macro expression inside private class expands macro of module with cursor at dot expands macro of module with cursor at dot expands macro expression inside module expands macro expression inside module expands macro of module expands macro of module expands macro control {% if %} with indent expands macro control {% if %} with indent expands macros with 2 level expands macros with 2 level expands macros with 3 level expands macros with 3 level expands macro expression inside def of module expands macro expression inside def of module expands macro control {% for %} with cursor at end of it expands macro control {% for %} with cursor at end of it expands macro control {% if %} expands macro control {% if %} doesn't expand normal call doesn't expand normal call expands macro of module inside module expands macro of module inside module expands macro expression inside private module expands macro expression inside private module expands macro expression inside class expands macro expression inside class expands macro control {% if %} with cursor at end of it expands macro control {% if %} with cursor at end of it expands macro expression inside fun expands macro expression inside fun expands macro expression {% ... %} with cursor at end of it expands macro expression {% ... %} with cursor at end of it expands macro expression inside enum expands macro expression inside enum expands macro expression inside C struct expands macro expression inside C struct expands macro expression {{ ... }} expands macro expression {{ ... }} expands macro expression inside private def expands macro expression inside private def expands macro expression inside def of private class expands macro expression inside def of private class expands macro control {% if %} with cursor inside it expands macro control {% if %} with cursor inside it expands macro expression inside def of private module expands macro expression inside def of private module expands simple macro with cursor at end of it expands simple macro with cursor at end of it expands macro of module with cursor at module name expands macro of module with cursor at module name expands macro control {% for %} with indent expands macro control {% for %} with indent expands macro expression {% ... %} expands macro expression {% ... %} expands simple macro with cursor inside it expands simple macro with cursor inside it expands macro expression inside struct expands macro expression inside struct doesn't expand macro expression doesn't expand macro expression expands macro expression inside lib expands macro expression inside lib expands macro expression inside C union of private lib expands macro expression inside C union of private lib expands macro control {% for %} with cursor inside it expands macro control {% for %} with cursor inside it expands simple macro expands simple macro expands macro expression inside C struct of private lib expands macro expression inside C struct of private lib doesn't expand macro expression doesn't expand macro expression expands macro expression inside def of private module expands macro expression inside def of private module expands macro expression inside private struct expands macro expression inside private struct expands macro expression {{ ... }} with cursor end of it expands macro expression {{ ... }} with cursor end of it expands macro with doc expands macro with doc expands macro expression inside def of nested private module expands macro expression inside def of nested private module expands macro expression inside def of private struct expands macro expression inside def of private struct doesn't expand macro expression with cursor out of end doesn't expand macro expression with cursor out of end expands macro expression inside private enum expands macro expression inside private enum expands macro expression inside def of private enum expands macro expression inside def of private enum expands macro expression inside def of nested module expands macro expression inside def of nested module Crystal normalize_path assert assert assert assert assert assert assert assert Crystal::Repl::Interpreter extern discards primitive struct_or_union_set and get (struct) discards primitive struct_or_union_set and get (struct) sets struct field through pointer sets struct field through pointer interprets primitive struct_or_union_set and get (struct) interprets primitive struct_or_union_set and get (struct) discards primitive struct_or_union_set because it's a copy discards primitive struct_or_union_set because it's a copy does automatic C cast does automatic C cast sets extern struct proc field sets extern struct proc field interprets primitive struct_or_union_set and get (union) interprets primitive struct_or_union_set and get (union) Compiler has a valid version has a valid version treats all arguments post-filename as program arguments treats all arguments post-filename as program arguments runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename runs subcommand in preference to a filename compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file compiles a file Code gen: array literal spec creates custom generic array creates custom generic array creates custom generic array, with splats creates custom generic array, with splats creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array creates typed array 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 non-generic array in nested module creates custom non-generic array in nested 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 non-generic array creates custom non-generic array creates custom generic array via alias (2) creates custom generic array via alias (2) creates custom non-generic array in module creates custom non-generic array in module assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works assignment in array literal works creates custom non-generic array, with splats creates custom non-generic array, with splats creates custom generic array via alias creates custom generic array via alias Crystal::Command::FlagsVisitor different flags different flags unique flags unique flags only macro only macro MacroExpander expands macro with hash expands macro with hash expands macro with tuple expands macro with tuple sizeof gets sizeof Union(Nil, Proc(Int32)) gets sizeof Union(Nil, Proc(Int32)) gets sizeof Int32 gets sizeof Int32 errors with NamedTuple(x: Slice(Int32)) errors with NamedTuple(x: Slice(Int32)) errors with Tuple(Slice(Int32)) errors with Tuple(Slice(Int32)) errors with Union(Slice(Int32), Nil) errors with Union(Slice(Int32), Nil) errors with Slice errors with Slice gets sizeof Union(Nil, String, Regex) gets sizeof Union(Nil, String, Regex) gets sizeof Union(Int32, Char) gets sizeof Union(Int32, Char) gets sizeof Char gets sizeof Char gets sizeof Bool gets sizeof Bool errors with Flags errors with Flags gets sizeof Float32 gets sizeof Float32 gets sizeof enum gets sizeof enum errors with alias of unstable type errors with alias of unstable type gets sizeof Proc(Int32) gets sizeof Proc(Int32) errors with Float errors with Float errors with typeof errors with typeof gets sizeof Void gets sizeof Void errors with Struct errors with Struct gets sizeof Symbol gets sizeof Symbol gets sizeof alias gets sizeof alias gets sizeof Nil gets sizeof Nil errors with Enumerable(Int32) errors with Enumerable(Int32) gets sizeof NamedTuple(x: Int32) gets sizeof NamedTuple(x: Int32) errors with typedef of unstable type errors with typedef of unstable type errors with Slice(Int32) errors with Slice(Int32) gets sizeof Reference gets sizeof Reference errors with Int errors with Int errors with StaticArray(Slice(Int32), 1) errors with StaticArray(Slice(Int32), 1) gets sizeof typedef gets sizeof typedef gets sizeof Union(Int32, String) gets sizeof Union(Int32, String) errors with Enumerable errors with Enumerable gets sizeof Tuple(Int32) gets sizeof Tuple(Int32) gets sizeof Pointer(Void) gets sizeof Pointer(Void) gets sizeof Union(Nil, String) gets sizeof Union(Nil, String) gets sizeof StaticArray(Int32, 1) gets sizeof StaticArray(Int32, 1) errors with Value errors with Value gets sizeof String gets sizeof String expands macro with symbol substitution expands macro with symbol substitution expands macro with boolean expands macro with boolean expands macro with or (2) expands macro with or (2) expands macro with empty tuple expands macro with empty tuple expands macro with or (1) expands macro with or (1) expands macro with argument-less call substitution expands macro with argument-less call substitution expands macro with string substitution expands macro with string substitution expands macro with range expands macro with range does regular if does regular if expands macro with var substitution expands macro with var substitution expands macro with integer expands macro with integer alignof errors with Enumerable(Int32) errors with Enumerable(Int32) gets alignof Union(Nil, String) gets alignof Union(Nil, String) errors with Slice(Int32) errors with Slice(Int32) gets alignof Tuple(Int32) gets alignof Tuple(Int32) gets alignof alias gets alignof alias errors with Flags errors with Flags errors with Slice errors with Slice gets alignof Int32 gets alignof Int32 errors with Int errors with Int gets alignof Union(Nil, String, Regex) gets alignof Union(Nil, String, Regex) gets alignof StaticArray(Int32, 1) gets alignof StaticArray(Int32, 1) gets alignof Char gets alignof Char errors with typedef of unstable type errors with typedef of unstable type errors with Union(Slice(Int32), Nil) errors with Union(Slice(Int32), Nil) gets alignof typedef gets alignof typedef gets alignof NamedTuple(x: Int32) gets alignof NamedTuple(x: Int32) errors with StaticArray(Slice(Int32), 1) errors with StaticArray(Slice(Int32), 1) gets alignof Bool gets alignof Bool gets alignof enum gets alignof enum gets alignof Pointer(Void) gets alignof Pointer(Void) gets alignof Union(Int32, Char) gets alignof Union(Int32, Char) gets alignof Void gets alignof Void gets alignof Union(Nil, Proc(Int32)) gets alignof Union(Nil, Proc(Int32)) errors with typeof errors with typeof gets alignof Union(Int32, String) gets alignof Union(Int32, String) errors with NamedTuple(x: Slice(Int32)) errors with NamedTuple(x: Slice(Int32)) gets alignof Nil gets alignof Nil errors with Value errors with Value errors with Float errors with Float gets alignof Reference gets alignof Reference errors with alias of unstable type errors with alias of unstable type errors with Enumerable errors with Enumerable gets alignof Float32 gets alignof Float32 gets alignof Symbol gets alignof Symbol gets alignof String gets alignof String errors with Tuple(Slice(Int32)) errors with Tuple(Slice(Int32)) errors with Struct errors with Struct gets alignof Proc(Int32) gets alignof Proc(Int32) outputs invisible location pragmas outputs invisible location pragmas does regular unless does regular unless can't use `yield` outside a macro can't use `yield` outside a macro for expands macro with for over range literal expands macro with for over range literal 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 expands macro with for over array literal expands macro with for over hash literal expands macro with for over hash literal 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, evaluating elements (exclusive) expands macro with for over range literal, evaluating elements (exclusive) 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 for over embedded array literal expands macro with for over embedded array literal expands macro with and (1) expands macro with and (1) expands macro with and (2) expands macro with and (2) does not expand when macro expression is {% ... %} does not expand when macro expression is {% ... %} expands macro with char expands macro with char expands macro with array expands macro with array expands simple macro expands simple macro expands macro with string interpolation expands macro with string interpolation expands macro with symbol expands macro with symbol expands macro with nil expands macro with nil if expands macro with if when truthy expands macro with if when truthy expands macro with if with nop expands macro with if with nop expands macro with if else when falsey expands macro with if else when falsey expands macro with if with not expands macro with if with not expands macro with if when falsey expands macro with if when falsey expands macro with string expands macro with string expands macro with empty named tuple expands macro with empty named tuple Normalize: op assign normalizes var += normalizes var += normalizes var &*= normalizes var &*= normalizes var &+= normalizes var &+= normalizes var *= normalizes var *= normalizes exp[value] &&= normalizes exp[value] &&= normalizes var ||= normalizes var ||= normalizes @@var.value += normalizes @@var.value += normalizes var &-= normalizes var &-= normalizes @var[0] += normalizes @var[0] += normalizes exp[0] += normalizes exp[0] += normalizes exp.value += normalizes exp.value += normalizes exp.value &&= normalizes exp.value &&= normalizes var -= normalizes var -= normalizes exp[value] ||= normalizes exp[value] ||= normalizes with filename normalizes with filename 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.value += normalizes var.value += normalizes var[0] += normalizes var[0] += Code gen: or codegens or with bool false and true codegens or with bool false and true codegens or with primitive type other than bool codegens or with primitive type other than bool codegens or with bool union as left node 1 codegens or with bool union as left node 1 codegens or with primitive type other than bool codegens or with primitive type other than bool codegens or with nil union as left node 2 codegens or with nil union as left node 2 codegens or with bool false and false codegens or with bool false and false codegens or with bool union as left node 3 codegens or with bool union as left node 3 codegens or with bool and int 2 codegens or with bool and int 2 codegens or with nil union as left node 1 codegens or with nil union as left node 1 codegens or with bool true and true codegens or with bool true and true 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 2 codegens or with bool union 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 non-false union as left node codegens or with non-false union as left node 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 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 nilable as left node 1 codegens or with nilable as left node 1 codegens or with nilable as left node 2 codegens or with nilable as left node 2 codegens or with bool true and false codegens or with bool true and false codegens or with bool and int 1 codegens or with bool and int 1 Crystal::Repl::Interpreter tuple interprets tuple metaclass range indexer interprets tuple metaclass range indexer does tuple indexer on union does tuple indexer on union interprets tuple metaclass indexer interprets tuple metaclass indexer interprets tuple self interprets tuple self unpacks tuple in block arguments unpacks tuple in block arguments discards tuple (#12383) discards tuple (#12383) interprets tuple range indexer (2) interprets tuple range indexer (2) interprets tuple literal of different types (2) interprets tuple literal of different types (2) interprets tuple literal of different types (1) interprets tuple literal of different types (1) interprets tuple literal and access by known index interprets tuple literal and access by known index discards tuple access discards tuple access interprets tuple range indexer interprets tuple range indexer extends sign when doing to_i32 extends sign when doing to_i32 Code gen: generic class type doesn't consider abstract types for including types (#7200) doesn't consider abstract types for including types (#7200) doesn't use virtual + in type arguments (#2839) doesn't use virtual + in type arguments (#2839) 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) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) recomputes two calls that look the same due to generic type being instantiated (#7728) declares instance var with virtual T (#1675) declares instance var with virtual T (#1675) accesses generic type argument from superclass, def context (#10834) accesses generic type argument from superclass, def context (#10834) inherited instance var initialize from generic to generic to concrete (#2128) inherited instance var initialize from generic to generic to concrete (#2128) 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 allows initializing instance variable (#665) allows initializing instance variable (#665) invokes super in generic class (#2354) invokes super in generic class (#2354) runs generic instance var initializers in superclass's metaclass context (2) (#6482) runs generic instance var initializers in superclass's metaclass context (2) (#6482) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) uses big integer as generic type argument (#2353) doesn't use virtual + in type arguments for Tuple (#2839) doesn't use virtual + in type arguments for Tuple (#2839) accesses generic type argument from superclass, metaclass context accesses generic type argument from superclass, metaclass context doesn't run generic instance var initializers in formal superclass's context (#4753) doesn't run generic instance var initializers in formal superclass's context (#4753) allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type doesn't crash on generic type restriction with initially no subtypes (#8411) doesn't crash on generic type restriction with initially no subtypes (#8411) codegens virtual generic metaclass macro method call codegens virtual generic metaclass macro method call inherited instance var initialize from generic to concrete (#2128) inherited instance var initialize from generic to concrete (#2128) runs generic instance var initializers in superclass's metaclass context (#4753) runs generic instance var initializers in superclass's metaclass context (#4753) doesn't crash on generic type restriction with no subtypes (#7583) doesn't crash on generic type restriction with no subtypes (#7583) instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) doesn't consider abstract generic instantiation when restricting type (#5190) doesn't consider abstract generic instantiation when restricting type (#5190) doesn't use virtual + in type arguments for NamedTuple (#2839) doesn't use virtual + in type arguments for NamedTuple (#2839) accesses generic type argument from superclass, macro context accesses generic type argument from superclass, macro context codegens inherited generic class instance var codegens inherited generic class instance var codegens static array size after instantiating codegens static array size after instantiating Semantic: sizeof gives error if using instance_sizeof on a module gives error if using instance_sizeof on a module 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 generic type without type vars gives error if using instance_sizeof on a generic type without type vars 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 metaclass gives error if using instance_sizeof on a metaclass types alignof types alignof types sizeof NoReturn (missing type) (#5717) types sizeof NoReturn (missing type) (#5717) types sizeof types sizeof types instance_alignof NoReturn (missing type) (#5717) types instance_alignof 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 something that's not a class gives error if using instance_sizeof on something that's not a class types instance_sizeof NoReturn (missing type) (#5717) types instance_sizeof NoReturn (missing type) (#5717) types alignof NoReturn (missing type) (#5717) types alignof NoReturn (missing type) (#5717) 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 instance_alignof types instance_alignof Crystal::Repl::Interpreter types does class method on virtual metaclass casted to generic metaclass (#12302) does class method on virtual metaclass casted to generic metaclass (#12302) interprets class for virtual_type type interprets class for virtual_type type discards generic discards generic interprets class_crystal_instance_type_id interprets class_crystal_instance_type_id discards crystal_type_id discards crystal_type_id interprets class for module type (#12203) interprets class for module type (#12203) discards class for non-union type discards class for non-union type discards .class discards .class 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 crystal_type_id for non-nil interprets crystal_type_id for non-nil interprets class for non-union type interprets class for non-union type discards Path discards Path interprets crystal_type_id for nil interprets crystal_type_id for nil discards class for virtual_type type discards class for virtual_type type discards typeof discards typeof interprets path to type interprets path to type Crystal::Doc::Type doesn't show types for alias type doesn't show types for alias type #instance_methods sorts operators first sorts operators first ASTNode has no ancestors ASTNode has no ancestors #macros sorts operators first sorts operators first #class_methods sorts operators first sorts operators first ASTNode has no superclass ASTNode has no superclass finds construct when searching class method (#8095) finds construct when searching class method (#8095) #node_to_html shows relative generic shows relative generic shows named tuples shows named tuples shows tuples shows tuples shows generic path with necessary colons shows generic path with necessary colons shows generic path with unnecessary colons shows generic path with unnecessary colons shows relative path shows relative path Codegen: const allows constants with same name allows constants with same name 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 initializes simple const initializes simple const 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 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 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 support constant inside a def support constant inside a def supports closured vars inside initializers (#10474) supports closured vars inside initializers (#10474) inlines enum value inlines enum value constants with expression constants with expression finds global constant finds global constant codegens constant that is declared later because of virtual dispatch codegens constant that is declared later because of virtual dispatch 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) 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 codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct codegens constant that refers to another constant that is a struct inlines const referencing another const inlines const referencing another const synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants synchronizes initialization of constants finds nearest constant first finds nearest constant first define a constant in lib define a constant in lib 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 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 declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var declaring var inlines char const inlines char const initializes simple const via another const initializes simple const via another const gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant gets pointerof constant inlines const with math inlines const with math inlines simple const inlines simple const runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) runs const side effects (#8862) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) uses const before declaring it (hoisting) codegens 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 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 define a constant define a constant uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup uses correct types lookup initializes ARGC_UNSAFE initializes ARGC_UNSAFE supports storing function returning nil supports storing function returning nil support nested constant support nested constant 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) Semantic: annotation errors if wanting to add type inside annotation (2) (#8614) errors if wanting to add type inside annotation (2) (#8614) #annotation can't find annotation on def, when other annotations are present can't find annotation on def, when other annotations are present finds annotation in lib finds annotation in lib overrides annotation value in type overrides annotation value in type can't find annotation in module can't find annotation in module finds annotation in module finds annotation in module overrides annotation in instance var overrides annotation in instance var finds annotation in struct finds annotation in struct adds annotation on def adds annotation on def finds annotation on method double splat arg finds annotation on method double splat arg uses annotation value, keyword uses annotation value, keyword errors if using annotation other than ThreadLocal for class vars errors if using annotation other than ThreadLocal for class vars finds annotation on an restricted method block arg finds annotation on an restricted method block arg can't find annotation in instance var can't find annotation in instance var finds annotation in generic parent (#7885) finds annotation in generic parent (#7885) uses annotation value, positional uses annotation value, positional can't find annotation in module, when other annotations are present can't find annotation in module, when other annotations are present finds annotation in instance var (assignment) finds annotation in instance var (assignment) finds annotation on method splat arg finds annotation on method splat arg errors if annotation doesn't exist errors if annotation doesn't exist errors if using invalid annotation on fun errors if using invalid annotation on fun finds annotation on method arg finds annotation on method arg finds annotation in instance var (declaration) finds annotation in instance var (declaration) finds annotation in class finds annotation in class doesn't carry link annotation from lib to fun doesn't carry link annotation from lib to fun can't find annotation in instance var, when other annotations are present can't find annotation in instance var, when other annotations are present errors if annotation doesn't point to an annotation type errors if annotation doesn't point to an annotation type finds annotation in instance var (declaration, generic) finds annotation in instance var (declaration, generic) finds annotation in enum finds annotation in enum can't find annotation on def can't find annotation on def errors if wanting to add type inside annotation (1) (#8614) errors if wanting to add type inside annotation (1) (#8614) arguments #named_args returns a NamedTupleLiteral if there are named arguments defined returns a NamedTupleLiteral if there are named arguments defined returns an empty NamedTupleLiteral if there are none defined returns an empty NamedTupleLiteral if there are none defined #args returns a TupleLiteral if there are positional arguments defined returns a TupleLiteral if there are positional arguments defined returns an empty TupleLiteral if there are none defined returns an empty TupleLiteral if there are none defined returns a correctly with named and positional args returns a correctly with named and positional args errors when annotate instance variable in subclass errors when annotate instance variable in subclass declares annotation declares annotation #annotations all types finds annotations on a class finds annotations on a class finds annotations on a lib finds annotations on a lib finds annotations on a module finds annotations on a module finds annotations in instance var (declaration) finds annotations in instance var (declaration) finds annotations on a enum finds annotations on a enum finds annotations in generic parent (#7885) finds annotations in generic parent (#7885) returns an empty array if there are none defined returns an empty array if there are none defined adds annotations on def adds annotations on def find annotations on method parameters find annotations on method parameters finds annotations on a struct finds annotations on a struct finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) of a specific type adds annotations on def adds annotations on def uses annotations value, positional uses annotations value, positional can't find annotations in instance var, when other annotations are present can't find annotations in instance var, when other annotations are present collects annotations values in type collects annotations values in type uses annotations value, keyword uses annotations value, keyword finds annotations on a module finds annotations on a module finds annotations in lib finds annotations in lib finds annotations in instance var (declaration, generic) finds annotations in instance var (declaration, generic) can't find annotations on def can't find annotations on def finds annotations in class finds annotations in class can't find annotations in instance var can't find annotations in instance var find annotations on method parameters find annotations on method parameters 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 in enum finds annotations in enum overrides annotations value in type overrides annotations value in type can't find annotations on def, when other annotations are present can't find annotations on def, when other annotations are present returns an empty array if there are none defined returns an empty array if there are none defined finds annotations in struct finds annotations in struct doesn't bleed annotation from class into class variable (#8314) doesn't bleed annotation from class into class variable (#8314) Semantic: cast casts to same type is ok casts to same type is ok disallows casting to Reference disallows casting to Reference doesn't eagerly try to check cast type (#12268) doesn't eagerly try to check cast type (#12268) casts to base class making it virtual (1) casts to base class making it virtual (1) casts from union to compatible union casts from union to compatible union disallows casting to Class disallows casting to Class doesn't cast to virtual primitive (bug) doesn't cast to virtual primitive (bug) disallows casting fun to pointer disallows casting fun to pointer considers else to be unreachable (#9658) considers else to be unreachable (#9658) disallows casting int to pointer disallows casting int to pointer casts to incompatible type gives error casts to incompatible type gives error should error if can't cast even if not instantiated should error if can't cast even if not instantiated allows casting object to void pointer allows casting object to void pointer errors on cast inside a call that can't be instantiated errors on cast inside a call that can't be instantiated casts from pointer to generic class gives error casts from pointer to generic class gives error doesn't error if casting to a generic type doesn't error if casting to a generic type casts to target type even if can't infer casted value type (obsolete) casts to target type even if can't infer casted value type (obsolete) casts uninstantiated generic class to itself (#10882) casts uninstantiated generic class to itself (#10882) disallows casting to Object (#815) disallows casting to Object (#815) allows casting reference union to void pointer allows casting reference union to void pointer can cast to metaclass (2) (#11121) can cast to metaclass (2) (#11121) doesn't cast to unbound generic type (as) (#5927) doesn't cast to unbound generic type (as) (#5927) casts to bigger union casts to bigger union disallows casting pointer to fun disallows casting pointer to fun casts to generic virtual type casts to generic virtual type casts pointer of one type to another type casts pointer of one type to another type errors if casting nil to Object inside typeof (#2403) errors if casting nil to Object inside typeof (#2403) can cast to metaclass (bug) can cast to metaclass (bug) casts from union to incompatible union gives error casts from union to incompatible union gives error casts pointer to another type casts pointer to another type doesn't cast to unbound generic type (as?) (#5927) doesn't cast to unbound generic type (as?) (#5927) doesn't allow upcast of generic type var (#996) doesn't allow upcast of generic type var (#996) casts to module casts to module doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) casts to compatible type and use it casts to compatible type and use it allows casting NoReturn to any type (#2132) allows casting NoReturn to any type (#2132) can cast from Void* to virtual type (#3014) can cast from Void* to virtual type (#3014) casts to base class making it virtual (2) casts to base class making it virtual (2) Crystal::Repl::Interpreter exception handling raises and rescues specific exception type raises and rescues specific exception type executes ensure when breaking from a block executes ensure when breaking from a block executes ensure when exception is raised in rescue executes ensure when exception is raised in rescue raises and rescues anything raises and rescues anything does ensure for else does ensure for else captures exception in variable captures exception in variable does ensure with explicit return does ensure with explicit return does else does else 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 executes ensure when returning from a block (2) executes ensure when returning from a block (2) raises and rescues anything, does ensure when an exception is rescued raises and rescues anything, does ensure when an exception is rescued executes ensure when exception is raised in body executes ensure when exception is raised in body does ensure without rescue/raise does ensure without rescue/raise does ensure for else when else raises does ensure for else when else raises Semantic: hooks includes error message in included hook (#889) includes error message in included hook (#889) errors if wrong inherited params size errors if wrong inherited params size types macro finished hook bug regarding initialize (#3964) types macro finished hook bug regarding initialize (#3964) does inherited macro does inherited macro types initializer in inherited types initializer in inherited does included macro for generic module does included macro for generic module errors if wrong extended params size errors if wrong extended params size does included macro does included macro errors if wrong finished params length errors if wrong finished params length does not invoke 'method_added' hook recursively does not invoke 'method_added' hook recursively errors if wrong extended params length errors if wrong extended params length does inherited macro through generic instance type (#9693) does inherited macro through generic instance type (#9693) errors if wrong included params size errors if wrong included params size does added method macro does added method macro does extended macro does extended macro does inherited macro for generic class does inherited macro for generic class Code gen: case 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 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 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 codegens case with class codegens case with class does case when with metaclass does case when with metaclass codegens value-less case codegens value-less case codegens case when constant bug (#1028) codegens case when constant bug (#1028) 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 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 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 Code gen: struct returns self with block returns self with block 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) creates structs creates structs returns struct as a copy returns struct as a copy creates struct in def creates struct in def codegens struct assigned to underscore (#1842) codegens struct assigned to underscore (#1842) 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 creates structs with instance var creates structs with instance var does phi of struct does phi of struct 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) codegens virtual structs union (1) codegens virtual structs union (1) codegens virtual struct metaclass (#2551) (1) codegens virtual struct metaclass (#2551) (1) 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 returns self returns self uses nilable struct uses nilable 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 mutates a virtual struct mutates a virtual struct allows assigning to struct argument (bug) allows assigning to struct argument (bug) codegens virtual struct codegens virtual struct assigning a struct makes a copy (1) assigning a struct makes a copy (1) passes a struct as a parameter makes a copy passes a struct as a parameter makes a copy casts virtual struct to base type, only one subclass (#2885) casts virtual struct to base type, only one subclass (#2885) codegens virtual struct metaclass (#2551) (3) codegens virtual struct metaclass (#2551) (3) codegens virtual struct metaclass (#2551) (2) codegens virtual struct metaclass (#2551) (2) codegens virtual struct with pointer codegens virtual struct with pointer codegens virtual structs union (2) codegens virtual structs union (2) Code gen: method_missing does method_missing with assignment (2) (bug) does method_missing with assignment (2) (bug) 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 args (with call) does method_missing macro with args (with call) does method_missing macro with virtual type (4) does method_missing macro with virtual type (4) does method_missing macro without args does method_missing macro without args 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 included module does method_missing macro with included module does method_missing macro with virtual type (2) does method_missing macro with virtual type (2) does method_missing macro with virtual type (7) does method_missing macro with virtual type (7) does method_missing macro with virtual type (1) does method_missing macro with virtual type (1) does method_missing generating method does method_missing generating method does method_missing macro with args does method_missing macro with args does method_missing macro with block does method_missing macro with block does method_missing with assignment (bug) does method_missing with assignment (bug) works with named arguments (#3654) works with named arguments (#3654) does method_missing macro with module involved does method_missing macro with module involved does method_missing macro with virtual type (3) does method_missing macro with virtual type (3) does method_missing macro without args (with call) does method_missing macro without args (with call) does method_missing macro with virtual type (6) does method_missing macro with virtual type (6) does method_missing macro with top level method involved does method_missing macro with top level method involved does method_missing macro with virtual type (5) does method_missing macro with virtual type (5) does method_missing macro with virtual type (8) does method_missing macro with virtual type (8) finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' Crystal::Macro proc notation methods gets empty output gets empty output executes resolve executes resolve gets multiple inputs gets multiple inputs gets single output gets single output gets single input gets single input executes resolve? executes resolve? call methods executes named args value executes named args value executes receiver executes receiver executes global? executes global? executes name executes name executes block arg executes block arg executes block arg (nop) executes block arg (nop) executes block executes block executes named args executes named args executes args executes args executes named args name executes named args name executes assign executes assign proc pointer methods executes args when empty executes args when empty executes obj when absent executes obj when absent executes args when not empty executes args when not empty executes name executes name executes obj when present executes obj when present executes global? executes global? splat methods executes exp executes exp Crystal::AnnotationDef executes kind executes kind executes body executes body executes name executes name Crystal::Asm executes outputs executes outputs executes text executes text executes clobbers executes clobbers executes intel? executes intel? executes can_throw? executes can_throw? executes alignstack? executes alignstack? executes inputs executes inputs executes volatile? executes volatile? Crystal::FunDef executes has_body? executes has_body? executes real_name executes real_name executes return_type executes return_type executes name executes name executes variadic? executes variadic? executes body executes body executes args executes args uninitialized var methods executes type executes type executes var executes var global methods executes name executes name Crystal::HashLiteral creates a hash literal with a var creates a hash literal with a var executes values executes values executes double splat executes double splat executes double splat executes double splat executes to_a executes to_a executes map executes map executes of_value (nop) executes of_value (nop) executes has_key? executes has_key? executes size executes size executes [] not found executes [] not found executes []= executes []= executes empty? executes empty? #each without either argument builds the correct array builds the correct array without the value argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array without the key argument builds the correct array builds the correct array executes type executes type executes type (nop) executes type (nop) executes of_key (nop) executes of_key (nop) executes [] executes [] executes of_key executes of_key executes double splat with arg executes double splat with arg executes is_a? executes is_a? executes of_value executes of_value executes keys executes keys generic methods executes resolve executes resolve executes named_args executes named_args executes type_vars executes type_vars executes types executes types executes name executes name executes resolve? executes resolve? Crystal::NamedTupleLiteral executes double splat executes double splat executes [] with invalid key type executes [] with invalid key type executes empty? executes empty? creates a named tuple literal with a var creates a named tuple literal with a var executes [] executes [] executes double splat executes double splat executes to_a executes to_a executes is_a? executes is_a? executes has_key? executes has_key? executes values executes values executes [] not found executes [] not found executes keys executes keys executes double splat with arg executes double splat with arg executes []= executes []= executes size executes size #each without the value argument 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 with both arguments builds the correct array builds the correct array executes map executes map yield methods executes scope (nop) executes scope (nop) executes scope executes scope executes expressions executes expressions Crystal::ArrayLiteral executes select executes select calls block exactly once for each element in #sort_by calls block exactly once for each element in #sort_by executes [] with computed range executes [] with computed range executes index 0 executes index 0 executes sort with ids and strings executes sort with ids and strings #- with ArrayLiteral argument removes the elements in RHS from LHS into an ArrayLiteral removes the elements in RHS from LHS into an ArrayLiteral with TupleLiteral argument removes the elements in RHS from LHS into an ArrayLiteral removes the elements in RHS from LHS into an ArrayLiteral executes unshift executes unshift executes is_a? executes is_a? executes sort with numbers executes sort with numbers executes of executes of executes []= executes []= executes any? (false) executes any? (false) executes splat executes splat executes join executes join executes empty? executes empty? executes sort with strings executes sort with strings executes map executes map executes [] with incomplete range executes [] with incomplete range executes all? (true) executes all? (true) executes of (nop) executes of (nop) executes index 1 executes index 1 executes last executes last executes splat with splat executes splat with splat executes * executes * executes any? (true) executes any? (true) executes index out of bounds executes index out of bounds executes first executes first executes includes? executes includes? executes map with arg executes map with arg executes identify executes identify executes uniq executes uniq executes reduce with no initial value executes reduce with no initial value executes sort with ids executes sort with ids executes size executes size executes find (doesn't find) executes find (doesn't find) creates an array literal with a var creates an array literal with a var executes reject executes reject executes type (nop) executes type (nop) executes find (finds) executes find (finds) #+ 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 #each_with_index without the element argument builds the correct array builds the correct array without either argument builds the correct array builds the correct array without the index argument builds the correct array builds the correct array with both arguments builds the correct array builds the correct array executes push executes push executes all? (false) executes all? (false) #each #each executes [] with two numbers executes [] with two numbers executes [] with range executes [] with range executes map with constants executes map with constants executes join with strings executes join with strings executes sort_by executes sort_by executes splat with symbols and strings executes splat with symbols and strings executes reduce with initial value executes reduce with initial value #map_with_index without the element argument returns the resulting array returns the resulting array with both arguments returns the resulting array returns the resulting array without either argument returns the resulting array returns the resulting array without the index argument returns the resulting array returns the resulting array executes type executes type require methods executes path executes path node methods executes == on symbols (true) (#240) executes == on symbols (true) (#240) executes == on numbers (true) executes == on numbers (true) symbolize expands macro with symbolize call on string expands macro with symbolize call on string expands macro with symbolize call on symbol expands macro with symbolize call on symbol expands macro with symbolize call on id expands macro with symbolize call on id id expands macro with id call on char expands macro with id call on char expands macro with id call on number expands macro with id call on number expands macro with id call on path expands macro with id call on path expands macro with id call on call expands macro with id call on call expands macro with id call on symbol expands macro with id call on symbol expands macro with id call on string expands macro with id call on string expands macro with id call on global path expands macro with id call on global path 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 line_number line_number end line_number end line_number filename filename end column number end column number column number column number executes != on numbers (false) executes != on numbers (false) executes != on numbers (true) executes != on numbers (true) executes == on numbers (false) executes == on numbers (false) #doc returns a multiline comment returns a multiline comment returns the call's docs if present (wants_doc = true) returns the call's docs if present (wants_doc = true) returns an empty string if there are no docs on the node (wants_doc = false) returns an empty string if there are no docs on the node (wants_doc = false) #nil? NilLiteral NilLiteral NumberLiteral NumberLiteral Nop Nop #is_a? union argument, duplicate type union argument, duplicate type union argument, undefined types union argument, undefined types union argument, contains NoReturn union argument, contains NoReturn union argument, mergeable union argument, mergeable union argument union argument union argument, unimplemented types union argument, unimplemented types executes == on symbols (false) (#240) executes == on symbols (false) (#240) stringify expands macro with stringify call on symbol expands macro with stringify call on symbol expands macro with stringify call on string expands macro with stringify call on string expands macro with stringify call on call expands macro with stringify call on call expands macro with stringify call on number expands macro with stringify call on number #doc_comment ensures each newline has a `#` prefix ensures each newline has a `#` prefix returns the call's docs if present as a MacroId (wants_doc = true) returns the call's docs if present as a MacroId (wants_doc = true) returns an empty MacroId if there are no docs on the node (wants_doc = false) returns an empty MacroId if there are no docs on the node (wants_doc = false) nilable cast methods executes obj executes obj executes to executes to instancevar methods executes name executes name Crystal::AsmOperand executes constraint executes constraint executes exp executes exp macro methods executes block_arg executes block_arg executes args executes args executes name executes name executes splat_index executes splat_index executes visibility executes visibility executes body executes body executes double_splat executes double_splat flag? has flag has flag doesn't have flag doesn't have flag path methods executes global? executes global? executes types executes types executes names executes names executes global executes global executes resolve? executes resolve? executes resolve executes resolve string methods executes camelcase with lower executes camelcase with lower executes string > macroid executes string > macroid executes lines executes lines executes chars executes chars executes [] with exclusive range executes [] with exclusive range executes string chomp executes string chomp executes tr executes tr executes upcase executes upcase executes camelcase executes camelcase executes string ends_with? string (true) executes string ends_with? string (true) executes string ends_with? char (false) executes string ends_with? char (false) executes strip executes strip executes string includes? char (true) executes string includes? char (true) executes string == string executes string == string executes string < string executes string < string executes downcase executes downcase executes camelcase with invalid lower arg type executes camelcase with invalid lower arg type executes [] with computed range executes [] with computed range executes split with argument executes split with argument executes string > string executes string > string executes string != string executes string != string executes string includes? string (true) executes string includes? string (true) executes underscore executes underscore executes to_i executes to_i executes capitalize executes capitalize executes string includes? char (false) executes string includes? char (false) executes to_i(base) executes to_i(base) executes string + char executes string + char executes string starts_with? char (false) executes string starts_with? char (false) executes string ends_with? string (false) executes string ends_with? string (false) executes string starts_with? string (true) executes string starts_with? string (true) executes string ends_with? char (true) executes string ends_with? char (true) executes string =~ (true) executes string =~ (true) executes to_utf16 executes to_utf16 executes string includes? string (false) executes string includes? string (false) executes split with char argument executes split with char argument executes string starts_with? char (true) executes string starts_with? char (true) executes empty executes empty executes [] with inclusive range executes [] with inclusive range executes scan executes scan executes string + string executes string + string executes titleize executes titleize executes string =~ (false) executes string =~ (false) executes string < macroid executes string < macroid executes count executes count executes string * number executes string * number executes string starts_with? string (false) executes string starts_with? string (false) executes [] with incomplete range executes [] with incomplete range executes split without arguments executes split without arguments executes gsub executes gsub executes size executes size exception handler methods executes else executes else executes body executes body executes ensure (nop) executes ensure (nop) executes else (nop) executes else (nop) executes ensure executes ensure executes rescue name executes rescue name executes rescues executes rescues executes rescue body executes rescue body executes rescue types executes rescue types Crystal::ExternalVar executes name executes name executes type executes type executes real_name executes real_name regex methods executes options executes options executes source executes source if methods executes else (nop) executes else (nop) executes then executes then executes cond executes cond executes else executes else expressions methods executes expressions executes expressions Crystal::TupleLiteral executes find (doesn't find) executes find (doesn't find) executes map with arg executes map with arg executes splat executes splat executes [] with 1 executes [] with 1 executes [] with 0 executes [] with 0 executes sort with strings executes sort with strings executes reject executes reject #map_with_index without either argument returns the resulting tuple returns the resulting tuple without the element 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 executes push executes push executes sort with ids and strings executes sort with ids and strings executes splat with splat executes splat with splat #each_with_index with both arguments builds the correct array builds the correct array without the element argument builds the correct array builds the correct array without either argument builds the correct array builds the correct array without the index argument builds the correct array builds the correct array executes size executes size executes join executes join executes all? (false) executes all? (false) executes any? (false) executes any? (false) executes select executes select executes sort with numbers executes sort with numbers executes uniq executes uniq #+ with TupleLiteral argument concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral with ArrayLiteral argument concatenates the literals into a TupleLiteral concatenates the literals into a TupleLiteral executes [] out of bounds executes [] out of bounds executes any? (true) executes any? (true) executes sort with ids executes sort with ids executes splat with arg executes splat with arg executes splat with symbols and strings executes splat with symbols and strings executes map executes map executes includes? executes includes? executes first executes first executes unshift executes unshift executes map with constants executes map with constants executes find (finds) executes find (finds) executes empty? executes empty? executes last executes last creates a tuple literal with a var creates a tuple literal with a var executes is_a? executes is_a? #each #each #- with ArrayLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral with TupleLiteral argument removes the elements in RHS from LHS into a TupleLiteral removes the elements in RHS from LHS into a TupleLiteral executes all? (true) executes all? (true) executes [] with incomplete range executes [] with incomplete range executes [] with range executes [] with range executes join with strings executes join with strings executes [] with computed range executes [] with computed range executes * executes * Crystal::Select executes else executes else executes whens executes whens Crystal::Include executes name executes name Crystal::Primitive executes name executes name block methods executes body executes body executes splat_index executes splat_index executes args executes args Crystal::CStructOrUnionDef executes body executes body executes union? executes union? executes name executes name executes kind executes kind executes assign without output executes assign without output Crystal::TypeOf executes args executes args env doesn't have key doesn't have key has key has key while methods executes body executes body executes cond executes cond Crystal::ClassDef executes abstract? executes abstract? executes splat_index executes splat_index executes struct? executes struct? executes type_vars executes type_vars executes body executes body executes superclass executes superclass executes kind executes kind executes name executes name type declaration methods executes var executes var executes var when instance var executes var when instance var executes type executes type executes value executes value Crystal::MacroExpression executes exp executes exp executes output? executes output? char methods executes zero? executes zero? executes ord executes ord union methods executes resolve executes resolve executes types executes types executes resolve? executes resolve? Crystal::TypeDef executes type executes type executes name executes name and methods executes left executes left executes right executes right case methods when executes else executes else executes cond executes cond executes when body executes when body executes exhaustive? executes exhaustive? executes whens executes whens executes when exhaustive? executes when exhaustive? executes when conds executes when conds in executes when exhaustive? executes when exhaustive? executes whens executes whens executes exhaustive? executes exhaustive? annotation methods executes [] with NumberLiteral executes [] with NumberLiteral executes name executes name executes [] with SymbolLiteral executes [] with SymbolLiteral executes [] with other ASTNode, but raises an error executes [] with other ASTNode, but raises an error executes [] with StringLiteral executes [] with StringLiteral executes [] with MacroId executes [] with MacroId instancevar methods executes name executes name symbol methods executes symbol == symbol executes symbol == symbol executes symbol != symbol executes symbol != symbol forwards methods to string forwards methods to string proc literal methods executes args executes args executes body executes body executes return_type executes return_type is_a methods executes arg executes arg executes receiver executes receiver metaclass methods executes resolve? executes resolve? executes resolve executes resolve executes instance executes instance macro if methods executes then executes then executes is_unless? executes is_unless? executes else executes else executes cond executes cond offsetof methods executes type executes type executes offset executes offset Crystal::Alias executes type executes type executes name executes name classvar methods executes name executes name Crystal::Extend executes name executes name Crystal::External executes is_a? executes is_a? number methods executes >> executes >> executes unary - executes unary - executes << executes << executes + executes + executes <=> executes <=> executes <= (false) executes <= (false) executes <= (true) executes <= (true) executes + and preserves type executes + and preserves type executes > (false) executes > (false) executes + with float executes + with float preserves integer size (#10713) preserves integer size (#10713) executes - executes - executes kind executes kind executes > (true) executes > (true) executes unary + executes unary + executes < (false) executes < (false) executes ** executes ** executes % executes % executes >= (true) executes >= (true) executes ^ executes ^ executes <=> (returns nil) executes <=> (returns nil) executes math operations using U/Int128 executes math operations using U/Int128 executes * executes * executes < (true) executes < (true) executes unary ~ executes unary ~ executes & executes & #to_number #to_number executes | executes | executes // executes // executes >= (false) executes >= (false) cast methods executes obj executes obj executes to executes to readinstancevar methods executes obj executes obj executes name executes name multi_assign methods executes targets executes targets executes values executes values Crystal::MacroVar executes expressions executes expressions executes name executes name compares versions compares versions macro for methods executes vars executes vars executes exp executes exp executes body executes body metavar methods executes is_a? executes is_a? executes name executes name executes id executes id executes nothing executes nothing control expression methods executes exp executes exp executes exp (nop) executes exp (nop) assign methods executes target executes target executes value executes value printing p! p! pp! pp! print print puts puts p p pp pp Crystal::RangeLiteral executes map executes map executes end executes end executes to_a executes to_a executes excludes_end? executes excludes_end? #each #each executes begin executes begin #parse_type union - Union union - Union raises on non StringLiteral arguments raises on non StringLiteral arguments raises on extra unparsed tokens before the type raises on extra unparsed tokens before the type metaclass metaclass union - | union - | generic generic exposes syntax warnings exposes syntax warnings union - in generic union - in generic raises on extra unparsed tokens after the type raises on extra unparsed tokens after the type proc proc raises on empty string raises on empty string path path Crystal::TypeNode executes > executes > executes size of tuple metaclass executes size of tuple metaclass executes ancestors executes ancestors executes instance_vars on symbol type executes instance_vars on symbol type executes < executes < executes union_types (non-union) executes union_types (non-union) executes private? false false true true executes superclass executes superclass #module? Crystal::NonGenericClassType class class struct struct Crystal::GenericModuleType Crystal::GenericModuleType Crystal::GenericClassType struct struct class class Crystal::NonGenericModuleType Crystal::NonGenericModuleType #id does not include trailing + for virtual type does not include trailing + for virtual type executes size of tuple executes size of tuple #class? Crystal::NonGenericClassType class class struct struct Crystal::GenericClassType struct struct class class Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType executes class vars executes class vars #instance_vars executes instance_vars executes instance_vars does not error when called from def scope does not error when called from def scope errors when called from top-level scope errors when called from top-level scope executes class_vars on symbol type executes class_vars on symbol type executes instance_vars on metaclass executes instance_vars on metaclass #includers returns an array of types `self` is directly included in returns an array of types `self` is directly included in == and != devirtualize generic type arguments (#10730) == and != devirtualize generic type arguments (#10730) executes == executes == executes resolve executes resolve executes resolve? executes resolve? #nilable? false false true true executes type_vars executes type_vars #has_inner_pointers? works on structs works on structs works on references works on references works on ReferenceStorage works on ReferenceStorage errors when called from top-level scope errors when called from top-level scope works on primitive values works on primitive values does not error when called from def scope does not error when called from def scope #struct? Crystal::NonGenericClassType class class struct struct Crystal::GenericClassType struct struct class class Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType executes ancestors (with generic) executes ancestors (with generic) executes class_vars on metaclass executes class_vars on metaclass executes class methods executes class methods executes instance executes instance executes methods executes methods public? true true false false #name generic_args true includes the generic_args of the type includes the generic_args of the type includes the generic_args of the instantiated type includes the generic_args of the instantiated type with an invalid type argument should raise the proper exception should raise the proper exception false does not include the generic_args of the type does not include the generic_args of the type does not include the generic_args of the instantiated type does not include the generic_args of the instantiated 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 namespaced type should return the FQN of the type should return the FQN of the type generic instance prints empty splat type var prints empty splat type var prints multiple arguments for splat type var prints multiple arguments for splat type var does not print extra commas for empty splat type var (3) does not print extra commas for empty splat type var (3) prints generic type arguments prints generic type arguments does not print extra commas for empty splat type var (1) does not print extra commas for empty splat type var (1) does not print extra commas for empty splat type var (2) does not print extra commas for empty splat type var (2) simple type returns the name of the type returns the name of the type executes class executes class #warning emits a warning at a specific node emits a warning at a specific node executes <= executes <= executes != executes != #abstract? Crystal::GenericModuleType Crystal::GenericModuleType Crystal::NonGenericModuleType Crystal::NonGenericModuleType Crystal::GenericClassType struct abstract abstract non-abstract non-abstract class non-abstract non-abstract abstract abstract Crystal::NonGenericClassType struct non-abstract non-abstract abstract abstract class non-abstract non-abstract abstract abstract executes class vars (with inheritance) executes class vars (with inheritance) #union? false false true true executes union_types (union) executes union_types (union) executes >= executes >= visibility private private public public macro id methods compares with string compares with string compares with symbol compares with symbol forwards methods to string forwards methods to string arg methods executes restriction executes restriction executes name executes name executes internal_name executes internal_name executes default_value executes default_value or methods executes left executes left executes right executes right Crystal::ModuleDef executes name executes name executes kind executes kind executes body executes body executes splat_index executes splat_index executes type_vars executes type_vars responds_to methods executes name executes name executes receiver executes receiver Crystal::MacroLiteral executes value executes value def methods executes args executes args executes return_type executes return_type executes receiver executes receiver executes visibility executes visibility executes accepts_block? executes accepts_block? executes abstract? executes abstract? executes splat_index executes splat_index executes double_splat executes double_splat executes free_vars executes free_vars executes body executes body executes name executes name executes block_arg executes block_arg Crystal::EnumDef executes body executes body executes kind executes kind executes base_type executes base_type executes name executes name #warning emits a top level warning emits a top level warning Crystal::LibDef executes name executes name executes body executes body executes kind executes kind unary expression methods executes is_a? executes is_a? executes exp executes exp visibility modifier methods executes exp executes exp executes visibility executes visibility Semantic: generic class inherits non-generic to generic (1) inherits non-generic to generic (1) instantiates generic variadic class, accesses T from instance method, more args instantiates generic variadic class, accesses T from instance method, more args 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) creates pointer of generic type and uses it creates pointer of generic type and uses it can use virtual type for generic class can use virtual type for generic class doesn't find T type parameter of current type in superclass (#4604) doesn't find T type parameter of current type in superclass (#4604) finds generic type argument from method with default value finds generic type argument from method with default value resolves T through metaclass inheritance (#7914) resolves T through metaclass inheritance (#7914) accesses generic type argument from superclass, metaclass context accesses generic type argument from superclass, metaclass context errors if using Number in alias errors if using Number in alias restricts generic to generic with free var restricts generic to generic with free var never types Generic as virtual outside generic type parameter (#3989) never types Generic as virtual outside generic type parameter (#3989) accesses generic type argument from superclass, macro context accesses generic type argument from superclass, macro context accesses generic type argument from superclass, def restriction accesses generic type argument from superclass, def restriction errors if using StaticArray in a generic type errors if using StaticArray in a generic type recomputes on new subclass recomputes on new subclass errors if using Object in a generic type errors if using Object in a generic type allows T::Type with T a generic type allows T::Type with T a generic type errors if using Number in recursive alias errors if using Number in recursive alias errors if inheriting from generic and incorrect number of type vars errors if inheriting from generic and incorrect number of type vars creates pointer of generic type and uses it (2) creates pointer of generic type and uses it (2) 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) restricts non-generic to generic with free var restricts non-generic to generic with free var instantiates generic variadic class, accesses T from class method instantiates generic variadic class, accesses T from class method errors if using Class in a generic type errors if using Class in a generic type errors if splatting a non-tuple (#9853) errors if splatting a non-tuple (#9853) can use type var that resolves to number in restriction using Int128 can use type var that resolves to number in restriction using Int128 gives helpful error message when generic type var is missing (#1526) gives helpful error message when generic type var is missing (#1526) can define instance var forward declared (#962) can define instance var forward declared (#962) doesn't consider unbound generic instantiations as concrete (#7200) doesn't consider unbound generic instantiations as concrete (#7200) allows initializing instance variable (#665) allows initializing instance variable (#665) errors if using Pointer in a generic type errors if using Pointer in a generic type errors if using Value in a generic type errors if using Value in a generic type errors if using Tuple in a generic type errors if using Tuple in a generic type can use type var that resolves to number in restriction (#6502) can use type var that resolves to number in restriction (#6502) subclasses twice with same generic class (#3423) subclasses twice with same generic class (#3423) restricts generic type argument through alias in a non-strict way restricts generic type argument through alias in a non-strict way errors if using Enum in a generic type errors if using Enum in a generic type accesses generic type argument from superclass, inherited #initialize (2) (#5243) accesses generic type argument from superclass, inherited #initialize (2) (#5243) accesses generic type argument from superclass, inherited #initialize (1) (#5243) accesses generic type argument from superclass, inherited #initialize (1) (#5243) errors if using Float in a generic type errors if using Float in a generic type restricts virtual generic instance type against generic (#3351) restricts virtual generic instance type against generic (#3351) errors if using Struct in a generic type errors if using Struct in a generic type calls super on generic type when superclass has no initialize (#933) calls super on generic type when superclass has no initialize (#933) inherits from generic with instantiation inherits from generic with instantiation uses inherited #initialize from superclass when generic type parameters are identical uses inherited #initialize from superclass when generic type parameters are identical replaces type parameters in virtual metaclasses (#10691) replaces type parameters in virtual metaclasses (#10691) errors if using Number in a generic type errors if using Number in a generic type doesn't crash when matching restriction against number literal (#3157) doesn't crash when matching restriction against number literal (#3157) inherits instance var type annotation from generic to concrete with T inherits instance var type annotation from generic to concrete with T splats generic type var splats generic type var accesses generic type argument from superclass, def context (#10834) accesses generic type argument from superclass, def context (#10834) disallow using a non-instantiated module type as a generic type argument disallow using a non-instantiated module type as a generic type argument errors on too nested generic instance, with union type errors on too nested generic instance, with union type errors if using Proc in a generic type errors if using Proc in a generic type 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 inherits from generic with instantiation with instance var inherits from generic with instantiation with instance var initializes instance variable of generic type using type var (#961) initializes instance variable of generic type using type var (#961) virtual metaclass type implements super virtual metaclass type (#3007) virtual metaclass type implements super virtual metaclass type (#3007) errors if inheriting generic type and not specifying type vars (#460) errors if inheriting generic type and not specifying type vars (#460) shows error due to generic instantiation (#7083) shows error due to generic instantiation (#7083) instantiates generic class with default argument in initialize (#394) instantiates generic class with default argument in initialize (#394) 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 disallow using a non-instantiated generic type as a generic type argument disallow using a non-instantiated generic type as a generic type argument 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 class methods from generic class inherits class methods from generic class inherits twice inherits twice nests generics with the same type var (#3297) nests generics with the same type var (#3297) errors if using Reference in a generic type errors if using Reference in a generic type 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 if passing integer literal to Proc as generic argument (#1120) errors if passing integer literal to Proc as generic argument (#1120) never types Path as virtual outside generic type parameter (#3989) never types Path as virtual outside generic type parameter (#3989) errors if passing integer literal to Union as generic argument errors if passing integer literal to Union as generic argument inherits non-generic to generic (2) inherits non-generic to generic (2) errors on too nested tuple instance errors on too nested tuple instance instantiates generic variadic class, accesses T from instance method, more args (2) instantiates generic variadic class, accesses T from instance method, more args (2) replaces type parameters for virtual types (#3235) replaces type parameters for virtual types (#3235) inherits from generic with forwarding (1) inherits from generic with forwarding (1) allows initializing instance variable in inherited generic type allows initializing instance variable in inherited generic type inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to concrete inherits instance var type annotation from generic to generic to concrete inherits instance var type annotation from generic to generic to concrete errors if invoking new on private new in generic type (#3485) errors if invoking new on private new in generic type (#3485) correctly checks argument count when target type has a splat (#9855) correctly checks argument count when target type has a splat (#9855) errors if using Int in a generic type errors if using Int in a generic type restricts non-generic to generic restricts non-generic to generic errors if inheriting from generic when it is non-generic errors if inheriting from generic when it is non-generic defines empty initialize on inherited generic class defines empty initialize on inherited generic class types macro def with generic instance types macro def with generic instance doesn't crash when matching restriction against number literal (2) (#3157) doesn't crash when matching restriction against number literal (2) (#3157) doesn't duplicate overload on generic class with class method (#2385) doesn't duplicate overload on generic class with class method (#2385) errors if using Number | String in a generic type errors if using Number | String in a generic type 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 instance method through superclass instantiates generic variadic class, accesses T from instance method through superclass instantiates generic variadic class, accesses T from class method through superclass instantiates generic variadic class, accesses T from class method through superclass instantiates generic variadic class, accesses T from instance method instantiates generic variadic class, accesses T from instance method errors on too nested generic instance errors on too nested generic instance inherits from generic with forwarding (2) inherits from generic with forwarding (2) Semantic: nil doesn't check return type for nil doesn't check return type for nil restricts type of 'if foo' on assign restricts type of 'if foo' on assign marks instance variables as nil when not in initialize marks instance variables as nil when not in initialize restricts type of 'while foo' on assign restricts type of 'while foo' on assign doesn't check return type for void doesn't check return type for void can call a fun with nil for pointer can call a fun with nil for pointer 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 can call a fun with nil for typedef pointer can call a fun with nil for typedef pointer types empty types empty marks instance variables as nil but doesn't explode on macros marks instance variables as nil but doesn't explode on macros restricts type of 'if foo' restricts type of 'if foo' types nil types nil Code gen: module 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) codegens module with virtual type codegens module with virtual type codegens pointer of module with method codegens pointer of module with method codegens pointer of module with method with two including types codegens pointer of module with method with two including types 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) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) invokes method on yielded module that has no instances (#1079) expands modules to its including types (2) (#1916) expands modules to its including types (2) (#1916) expands modules to its including types (3) (#1916) expands modules to its including types (3) (#1916) declares proc with module type declares proc with module type expands modules to its including types (#1916) expands modules to its including types (#1916) 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 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 can instantiate generic module can instantiate generic module codegens cast to module that includes bool codegens cast to module that includes bool codegens pointer of module and pass value to method codegens pointer of module and pass value to method codegens dispatch of union with module (#3647) codegens dispatch of union with module (#3647) codegens cast to module with class and struct to nilable module codegens cast to module with class and struct to nilable module 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) declares and includes generic module, in macros T is a tuple literal declares and includes generic module, in macros T is a tuple literal can use generic module as instance variable type (2) can use generic module as instance variable type (2) can use generic module as instance variable type can use generic module as instance variable type 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 proc of module when generic type includes it codegens proc of module when generic type includes it codegens proc of a module that was never included codegens proc of a module that was never included Codegen: until codegens until codegens until Code gen: and codegens and with bool and int 1 codegens and with bool and int 1 codegens and with bool true and false codegens and with bool true and false codegens and with nil union as left node 2 codegens and with nil union as left node 2 codegens and with bool false and false codegens and with bool false and false 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 4 codegens and with bool union as left node 4 codegens and with non-false union as left node codegens and with non-false union as left node 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 primitive type other than bool with union codegens and with primitive type other than bool with union codegens assign in right node, after must be nilable codegens assign in right node, after must be nilable 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 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 2 codegens and with bool union as left node 2 codegens and with bool and int 2 codegens and with bool and int 2 codegens and with primitive type other than bool codegens and with primitive type other than bool codegens assign in right node, after if must be nilable codegens assign in right node, after if must be nilable codegens assign in right node, inside if must not be nil codegens assign in right node, inside if must not be nil codegens and with bool union as left node 1 codegens and with bool union as left node 1 codegens and with bool true and true codegens and with bool true and true codegens and with bool union as left node 1 codegens and with bool union as left node 1 codegens and with nil union as left node 1 codegens and with nil union as left node 1 Semantic: struct types Struct#new types Struct#new errors if using void via typedef in struct field type errors if using void via typedef in struct field type errors on struct if no field errors on struct if no field errors if using void in struct field type errors if using void in struct field type errors if already defined with another type errors if already defined with another type errors if invoking to_i32! and got error in that call errors if invoking to_i32! and got error in that call types struct getter with keyword name types struct getter with keyword name errors if invoking to_unsafe and got error in that call errors if invoking to_unsafe and got error in that call errors if already defined errors if already defined errors if setting closure errors if setting closure errors if includes non-cstruct type errors if includes non-cstruct type errors if includes and field already exists, the other way around errors if includes and field already exists, the other way around supports macro if inside struct supports macro if inside struct errors on empty c struct (#633) errors on empty c struct (#633) allows inline forward declaration allows inline forward declaration types struct getter to struct types struct getter to struct can access instance var from the outside (#1092) can access instance var from the outside (#1092) errors if includes unknown type errors if includes unknown type types struct getter types struct getter errors if includes and field already exists errors if includes and field already exists types struct setter types struct setter errors if already defined with another type (2) errors if already defined with another type (2) automatically converts numeric type in struct field assignment automatically converts numeric type in struct field assignment includes another struct includes another struct errors on struct setter if different type via new errors on struct setter if different type via new types struct getter on pointer type types struct getter on pointer type errors if invoking to_unsafe and got different type errors if invoking to_unsafe and got different type errors if invoking to_i32! and got wrong type errors if invoking to_i32! and got wrong type types struct types struct marks as packed marks as packed errors on struct setter if different type errors on struct setter if different type types struct getter multiple levels via new types struct getter multiple levels via new Semantic: named tuples can assign to union of compatible named tuple can assign to union of compatible named tuple types T as a tuple of metaclasses types T as a tuple of metaclasses gives error when using named args on a type other than NamedTuple gives error when using named args on a type other than NamedTuple types named tuple access (2) types named tuple access (2) types nilable named tuple access (6) types nilable named tuple access (6) can write generic type for NamedTuple can write generic type for NamedTuple doesn't match in type restriction doesn't match in type restriction merges two named tuple with same keys but different types merges two named tuple with same keys but different types accept named tuple in type restriction accept named tuple in type restriction doesn't unify named tuple metaclasses (#5384) doesn't unify named tuple metaclasses (#5384) doesn't crash on named tuple type recursion (#7162) doesn't crash on named tuple type recursion (#7162) matches in type restriction, different order (2) matches in type restriction, different order (2) doesn't crash on named tuple in not executed block (#6718) doesn't crash on named tuple in not executed block (#6718) doesn't match type restriction with instance doesn't match type restriction with instance allows tuple covariance allows tuple covariance gives error when using positional args with NamedTuple gives error when using positional args with NamedTuple merges two named tuples with the same keys and types merges two named tuples with the same keys and types types named tuple access (4) types named tuple access (4) gives error when indexing with an unknown name gives error when indexing with an unknown name types named tuple access (3) types named tuple access (3) matches in type restriction matches in type restriction types named tuple of two elements, follows names order types named tuple of two elements, follows names order types nilable named tuple access (5) types nilable named tuple access (5) types nilable named tuple access (4) types nilable named tuple access (4) matches in type restriction and gets free var matches in type restriction and gets free var gets type at compile time gets type at compile time types named tuple access (1) types named tuple access (1) types nilable named tuple access (1) types nilable named tuple access (1) accepts named tuple covariance in array accepts named tuple covariance in array matches in type restriction, different order (1) matches in type restriction, different order (1) types nilable named tuple access (2) types nilable named tuple access (2) doesn't error if NamedTuple has no args doesn't error if NamedTuple has no args types nilable named tuple access (3) types nilable named tuple access (3) types named tuple of two elements types named tuple of two elements types named tuple of one element types named tuple of one element Semantic: initialize marks instance variable as nilable in initialize if using self in method marks instance variable as nilable in initialize if using self in method types instance var as nilable if used before assignment types instance var as nilable if used before assignment doesn't type instance var as nilable if used after method call that assigns var doesn't type instance var as nilable if used after method call that assigns var doesn't type instance var as nilable if out doesn't type instance var as nilable if out types instance var as nilable if assigned in block types instance var as nilable if assigned in block errors if found matches for initialize but doesn't cover all (bug #204) errors if found matches for initialize but doesn't cover all (bug #204) types instance vars as nilable if doesn't invoke super with default arguments types instance vars as nilable if doesn't invoke super with default arguments 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 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 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 types initializer of recursive generic type types initializer of recursive generic type doesn't mark instance variable as nilable when using self.class in method doesn't mark instance variable as nilable when using self.class in method types instance var as non-nilable if calls super and super defines it, with one level of indirection types instance var as non-nilable if calls super and super defines it, with one level of indirection types 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 checks instance vars of included modules checks instance vars of included modules types instance var as nilable if not always assigned types instance var as nilable if not always assigned errors on default new when using named arguments (#2245) errors on default new when using named arguments (#2245) 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 assigning self marks instance variable as nilable in initialize if assigning self doesn't type instance var as nilable if used after method call that doesn't read var doesn't type instance var as nilable if used after method call that doesn't read var types instance var as nilable if used in first of two method calls types instance var as nilable if used in first of two method calls types instance vars as nilable if doesn't invoke super in initialize types instance vars as nilable if doesn't invoke super in initialize types instance var as not-nilable if assigned in block but previously assigned types instance var as not-nilable if assigned in block but previously assigned 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 doesn't type instance var as nilable if used after global method call doesn't type instance var as nilable if used after global method call types instance var as nilable if used after method call that reads var types instance var as nilable if used after method call that reads var 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 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 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 Normalize: multi assign normalizes n to splat on left-hand side normalizes n to splat on left-hand side normalizes n to n with [] normalizes n 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 empty normalizes m to n, with splat on left-hand side, splat is empty 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 splat on left-hand side normalizes 1 to splat on left-hand side normalizes m to n, with *_ on left-hand side (2) normalizes m to n, with *_ on left-hand side (2) without strict_multi_assign normalizes 1 to n normalizes 1 to n normalizes 1 to n with [] normalizes 1 to n with [] normalizes 1 to n with call normalizes 1 to n with call normalizes 1 to n, with splat on left-hand side normalizes 1 to n, with splat on left-hand side normalizes m to n, with *_ on left-hand side (1) normalizes m to n, with *_ on left-hand side (1) normalizes 1 to 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 n, with *_ on left-hand side (2) normalizes 1 to n, with *_ on left-hand side (2) normalizes 1 to *_ on left-hand side normalizes 1 to *_ on left-hand side normalizes n to n with call normalizes n to n with call normalizes n to *_ on left-hand side normalizes n to *_ on left-hand side normalizes 1 to n, with *_ on left-hand side (1) normalizes 1 to n, with *_ on left-hand side (1) normalizes m to n, with splat on left-hand side, splat is non-empty normalizes m to n, with splat on left-hand side, splat is non-empty normalizes m to n, with *_ on left-hand side (3) normalizes m to n, with *_ on left-hand side (3) normalizes n to n normalizes n to n Restrictions works with union against unions of generics works with union against unions of generics errors if using typeof in block restriction errors if using typeof in block restriction 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) restricts virtual metaclass type against metaclass (#3438) restricts virtual metaclass type against metaclass (#3438) restriction_of? Metaclass vs Path 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 Object keeps metaclass before Object doesn't error if path is undefined and method is not called (1) (#12516) doesn't error if path is undefined and method is not called (1) (#12516) keeps metaclass before Class keeps metaclass before Class inserts metaclass before Object inserts metaclass before Object inserts metaclass before Value inserts metaclass before Value keeps metaclass before Value keeps metaclass before Value inserts metaclass before Class inserts metaclass before Class GenericClassType vs GenericClassInstanceType keeps GenericClassInstanceType before GenericClassType keeps GenericClassInstanceType before GenericClassType doesn't mix different generic classes doesn't mix different generic classes inserts GenericClassInstanceType before GenericClassType inserts GenericClassInstanceType before GenericClassType works with classes in different namespaces works with classes in different namespaces Underscore vs Path inserts Path before underscore (#12854) inserts Path before underscore (#12854) 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) 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 inserts typed Path before untyped Path inserts typed Path before untyped Path keeps typed Path before untyped Path keeps typed Path before untyped Path free variables keeps path before free variable with same name keeps path before free variable with same name keeps constant before free variable with same name keeps constant before free variable with same name keeps path before free variable even if free var resolves to a more specialized type keeps path before free variable even if free var resolves to a more specialized type inserts constant before free variable with same name inserts constant before free variable with same name inserts path before free variable with same name inserts path before free variable with same name inserts path before free variable even if free var resolves to a more specialized type inserts path before free variable even if free var resolves to a more specialized type Metaclass vs Metaclass keeps typed Metaclass before untyped Metaclass keeps typed Metaclass before untyped Metaclass inserts typed Metaclass before untyped Metaclass inserts typed Metaclass before untyped Metaclass Generic vs Path keeps untyped Generic before untyped Path keeps untyped Generic before untyped Path inserts untyped Generic before untyped Path inserts untyped Generic before untyped Path inserts untyped Generic before untyped Path (2) inserts untyped Generic before untyped Path (2) inserts typed Generic before untyped Path inserts typed Generic before untyped Path keeps typed Generic before untyped Path keeps typed Generic before untyped Path 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) 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 NamedTuple vs NamedTuple keeps more specialized NamedTuple before less specialized one keeps more specialized NamedTuple before less specialized one 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) works with generic compared to fixed (primitive) type works with generic compared to fixed (primitive) type works with static array (#637) works with static array (#637) errors if using typeof in block restriction errors if using typeof in block restriction passes #278 passes #278 matches virtual type against alias matches virtual type against alias should not let GenericChild(Base) pass as a GenericBase(Child) (#1294) should not let GenericChild(Base) pass as a GenericBase(Child) (#1294) allows passing recursive type to free var (#1076) allows passing recursive type to free var (#1076) errors if using NamedTuple with positional args errors if using NamedTuple with positional args matches number in bound free variable (#13605) matches number in bound free variable (#13605) works with generic class metaclass vs. generic instance class metaclass works with generic class metaclass vs. generic instance class metaclass makes metaclass subclass pass parent metaclass restriction (#2079) makes metaclass subclass pass parent metaclass restriction (#2079) doesn't error if using NamedTuple with no args doesn't error if using NamedTuple with no args 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 matches free variable for type variable matches free variable for type variable 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) works with generic class metaclass vs. generic class metaclass works with generic class metaclass vs. generic class metaclass self always matches instance type in return type self always matches instance type in return type restricts class union type to overloads with classes restricts class union type to overloads with classes sets number as unbound generic type var (#13110) sets number as unbound generic type var (#13110) 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 self always matches instance type in restriction self always matches instance type in restriction doesn't error if using Tuple with no args doesn't error if using Tuple with no args errors if using typeof errors if using typeof errors if using typeof inside generic type errors if using typeof inside generic type restrict restricts virtual type with included module 1 restricts virtual type with included module 1 restricts virtual type with included module 2 restricts virtual type with included module 2 restricts virtual generic class against uninstantiated generic subclass (2) restricts virtual generic class against uninstantiated generic subclass (2) 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 generic module instance with another module restricts generic module instance with another module restricts generic module instance with class restricts generic module instance with class restricts module through generic include (#4287) restricts module through generic include (#4287) restricts virtual generic class against uninstantiated generic subclass (1) restricts virtual generic class against uninstantiated generic subclass (1) restricts generic module instance with another generic module instance restricts generic module instance with another generic module instance restricts type with same type restricts type with same type restricts class against uninstantiated generic base class through multiple inheritance (2) (#9660) restricts class against uninstantiated generic base class through multiple inheritance (2) (#9660) restricts module with another module restricts module with another module restricts type with another type restricts type with another type restricts type with superclass restricts type with superclass restricts type with included module restricts type with included module matches alias against alias in block type matches alias against alias in block type sets number as free variable (#2699) sets number as free variable (#2699) works with static array that uses underscore works with static array that uses underscore restricts class union type to overloads with classes (2) restricts class union type to overloads with classes (2) restricts aliased typedef type (#9474) restricts aliased typedef type (#9474) errors if using free var without forall errors if using free var without forall errors on T::Type that's union when used from type restriction errors on T::Type that's union when used from type restriction errors if can't find type on lookup errors if can't find type on lookup Crystal::Repl::Interpreter is_a? does is_a? from VirtualType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (true) does is_a? from VirtualType to NonGenericClassType (false) does is_a? from VirtualType to NonGenericClassType (false) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableType to GenericClassInstanceType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (false) does is_a? from NilableType to NonGenericClassType (true) does is_a? from NilableType to NonGenericClassType (true) does is_a? from NilableProcType to non-Nil does is_a? from NilableProcType to non-Nil does is_a? from NilableType to NonGenericClassType (false) does is_a? from NilableType to NonGenericClassType (false) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableReferenceUnionType to NonGenericClassType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableType to GenericClassInstanceType (true) does is_a? from NilableProcType to Nil does is_a? from NilableProcType to Nil Semantic: nilable cast types as? with nil types as? with nil types as? with NoReturn types as? with NoReturn does upcast does upcast types as? with union types as? with union doesn't introduce type filter for nilable cast object (#12661) doesn't introduce type filter for nilable cast object (#12661) types as? types as? doesn't crash with typeof no-type (#7441) doesn't crash with typeof no-type (#7441) casts to module casts to module Crystal::Repl::Interpreter structs does call receiver by value from VirtualType abstract struct to union does call receiver by value from VirtualType abstract struct to union discards allocate discards allocate does simple struct instance var initializer does simple struct instance var initializer mutates struct inside union mutates struct inside union does simple class instance var initializer does simple class instance var initializer does class instance var initializer inheritance does class instance var initializer inheritance does complex class instance var initializer does complex class instance var initializer does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does call receiver by value from VirtualType abstract struct to concrete struct (#12190) does constructor does constructor casts def body to def type casts def body to def type does allocate, set instance var and get instance var does allocate, set instance var and get instance var sets multiple instance vars in virtual abstract struct call (#12187) sets multiple instance vars in virtual abstract struct call (#12187) mutates struct stored in class var mutates struct stored in class var inlines struct method that returns self (#12253) inlines struct method that returns self (#12253) interprets read instance var of struct interprets read instance var of struct Semantic: method_missing errors if method_missing expands to multiple methods errors if method_missing expands to multiple methods 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 doesn't look up method_missing in with_yield_scope if call has a receiver (#12097) doesn't look up method_missing in with_yield_scope if call has a receiver (#12097) does method missing for generic type does method missing for generic type finds method_missing with 'with ... yield' finds method_missing with 'with ... yield' errors if method_missing expands to an incorrect method errors if method_missing expands to an incorrect method Lexer string lexes regex string with escaped space with %r(...) lexes regex string with escaped space with %r(...) lexes double numeral lexes double numeral lexes heredoc with \r\n lexes heredoc with \r\n says syntax error on "\"\\u{110000}\"" says syntax error on "\"\\u{110000}\"" lexes string with numeral lexes string with numeral lexes backtick string lexes backtick string raises on unexpected EOF while lexing heredoc raises on unexpected EOF while lexing heredoc lexes string with unicode codepoint in curly multiple times lexes string with unicode codepoint in curly multiple times lexes regex string with escaped slash with %r(...) lexes regex string with escaped slash with %r(...) says syntax error on "\"\\uFEDZ\"" says syntax error on "\"\\uFEDZ\"" lexes simple string with nested %[ lexes simple string with nested %[ says syntax error on "\"\\u{}\"" says syntax error on "\"\\u{}\"" lexes string with interpolation with double numeral lexes string with interpolation with double numeral lexes string with literal newline lexes string with literal newline lexes slash with no-escape char lexes slash with no-escape char lexes simple string with nested %{ lexes simple string with nested %{ raises on unterminated heredoc raises on unterminated heredoc says syntax error on "\"\\uD800\"" says syntax error on "\"\\uD800\"" lexes simple string with nested %( lexes simple string with nested %( lexes regex string with escaped slash with /.../ lexes regex string with escaped slash with /.../ lexes string with slash lexes string with slash lexes string with unicode codepoint in curly lexes string with unicode codepoint in curly lexes interpolations in heredocs lexes interpolations in heredocs lexes regex string with special chars with %r(...) lexes regex string with special chars with %r(...) lexes regex string with special chars with /.../ lexes regex string with special chars with /.../ lexes string with only newline lexes string with only newline lexes string with slash quote lexes string with slash quote lexes simple string lexes simple string lexes string with slash t lexes string with slash t says syntax error on "\"\\uDFFF\"" says syntax error on "\"\\uDFFF\"" raises when identifier doesn't start with a letter or number raises when identifier doesn't start with a letter or number lexes simple string with nested %< lexes simple string with nested %< lexes heredoc with spaces before close tag lexes heredoc with spaces before close tag lexes string with unicode codepoint lexes string with unicode codepoint lexes string with backslash lexes string with backslash assigns correct location after heredoc (#346) assigns correct location after heredoc (#346) lexes regex string lexes regex string lexes heredoc lexes heredoc lexes regex string with escaped space with /.../ lexes regex string with escaped space with /.../ lexes string with newline lexes string with newline lexes heredoc with empty line lexes heredoc with empty line lexes string with interpolation lexes string with interpolation says syntax error on "\"\\u{D800}\"" says syntax error on "\"\\u{D800}\"" lexes simple string with %( lexes simple string with %( lexes simple string with %| lexes simple string with %| says syntax error on "\"\\u{DFFF}\"" says syntax error on "\"\\u{DFFF}\"" Semantic: extern struct overrides getter overrides getter can use extern struct in lib can use extern struct in lib declares extern union with no constructor declares extern union with no constructor can new with named args can new with named args can be passed to C fun can be passed to C fun 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 errors if using non-primitive for field type errors if using non-primitive for field type can include module can include module declares with constructor declares with constructor errors if using non-primitive for field type via module errors if using non-primitive for field type via module Code gen: op assign evaluates exps once (#3398) evaluates exps once (#3398) evaluates exps once, [] (#3398) evaluates exps once, [] (#3398) Crystal::Repl::Interpreter variadic calls promotes enum promotes enum promotes float promotes float promotes int promotes int command expansion expands ldflags expands ldflags Semantic: new evaluates initialize default value at the instance scope (1) (#731) evaluates initialize default value at the instance scope (1) (#731) errors if using self call in default argument (2) errors if using self call in default argument (2) 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 (6) (#731) evaluates initialize default value at the instance scope (6) (#731) evaluates initialize default value at the instance scope (3) (#731) evaluates initialize default value at the instance scope (3) (#731) inherits initialize and new methods if doesn't define new (#3238) inherits initialize and new methods if doesn't define new (#3238) evaluates initialize default value at the instance scope (5) (#731) evaluates initialize default value at the instance scope (5) (#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 (2) (#731) evaluates initialize default value at the instance scope (2) (#731) errors if using self call in default argument (3) errors if using self call in default argument (3) doesn't incorrectly redefines new for generic class doesn't incorrectly redefines new for generic class doesn't have default new for inherited class from generic type doesn't have default new for inherited class from generic type uses correct receiver for `initialize` in namespaced generic classes (#4086) uses correct receiver for `initialize` in namespaced generic classes (#4086) Normalize: or normalizes or with ! on var normalizes or with ! on var normalizes or with variable on the left normalizes or with variable on the left normalizes or with ! on var.is_a?(...) normalizes or with ! on var.is_a?(...) normalizes or with assignment on the left normalizes or with assignment on the left normalizes or with is_a? on var normalizes or with is_a? on var normalizes or without variable normalizes or without variable Crystal::Config .linux_runtime_libc .linux_runtime_libc .host_target .host_target Crystal::ABI::AArch64 abi_info does with structs less than 64 bits does with structs less than 64 bits does with homogeneous structs does with homogeneous structs does with structs between 64 and 128 bits does with structs between 64 and 128 bits does with structs larger than 128 bits does with structs larger than 128 bits does with primitives does with primitives size for packed struct for packed struct for float for float for integer for integer for pointer for pointer for struct for struct for double for double for array for array align for float for float for pointer for pointer for struct for struct for integer for integer for packed struct for packed struct for double for double for array for array Code gen: automatic cast casts Symbol to Enum in ivar type declaration casts Symbol to Enum in ivar type declaration casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in ivar type declaration in generic casts Int32 to Int64 in lvar assignment casts Int32 to Int64 in lvar assignment casts literal integer (Int32 -> Int64) casts literal integer (Int32 -> Int64) casts symbol literal to enum casts symbol literal to enum casts literal integer (Int64 -> Int32, ok) casts literal integer (Int64 -> Int32, ok) casts Int32 to Int64 in ivar type declaration casts Int32 to Int64 in ivar type declaration does multidispatch with automatic casting (3) does multidispatch with automatic casting (3) casts literal float (Float64 -> Float32) casts literal float (Float64 -> Float32) casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar type declaration casts Int32 to Int64 in cvar assignment casts Int32 to Int64 in cvar assignment does multidispatch with automatic casting (2) (#8217) does multidispatch with automatic casting (2) (#8217) casts Int32 to Int64 in ivar assignment casts Int32 to Int64 in ivar assignment casts literal float (Float32 -> Float64) casts literal float (Float32 -> Float64) casts Symbol to Enum in ivar assignment casts Symbol to Enum in ivar assignment 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 Int32 -> Int64 in arg restriction casts Int32 -> Int64 in arg restriction does multidispatch with automatic casting (1) (#8217) does multidispatch with automatic casting (1) (#8217) casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float32) casts literal integer (Int32 -> Float64) casts literal integer (Int32 -> Float64) Code gen: ssa codegens declaration of var inside then when true codegens declaration of var inside then when true codegens ssa bug (1) codegens ssa bug (1) codegens a var that is re-assigned in a block codegens a var that is re-assigned in a block codegens a var that is 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 a var that is declared in a block (2) codegens a var that is declared in a block (2) codegens ssa bug (2) codegens ssa bug (2) codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (1) codegens a var that is re-assigned in a block (2) codegens a var that is re-assigned in a block (2) codegens ssa bug with if/else on var codegens ssa bug with if/else on var codegens a redefined var inside method with argument codegens a redefined var inside method with argument codegens a redefined var inside method codegens a redefined var inside method Normalize: block normalizes multiple nested unpackings normalizes multiple nested unpackings normalizes unpacking with multiple body expressions normalizes unpacking with multiple body expressions normalizes unpacking with empty body normalizes unpacking with empty body normalizes unpacking with single expression body normalizes unpacking with single expression body normalizes unpacking with splat normalizes unpacking with splat normalizes unpacking with underscore normalizes unpacking with underscore normalizes nested unpacking normalizes nested unpacking Code gen: tuple codegens tuple [2..2]? codegens tuple [2..2]? downcasts union to mixed tuple type downcasts union to mixed tuple type codegens tuple metaclass [1] codegens tuple metaclass [1] codegens tuple [1..1] codegens tuple [1..1] codegens tuple metaclass [0] codegens tuple metaclass [0] codegens union of tuple of float with tuple of tuple of float codegens union of tuple of float with tuple of tuple of float codegens tuple class codegens tuple class downcasts union inside tuple to value (#3907) downcasts union inside tuple to value (#3907) codegens tuple [1..0] codegens tuple [1..0] merges two tuple types of same size (1) merges two tuple types of same size (1) codegens tuple metaclass [2]? codegens tuple metaclass [2]? passed tuple to def passed tuple to def allows tuple covariance allows tuple covariance codegens tuple [1] (2) codegens tuple [1] (2) codegens tuple [0..1]? codegens tuple [0..1]? allows malloc pointer of tuple allows malloc pointer of tuple accesses T and creates instance from it accesses T and creates instance from it assigns two same-size tuple types to a same var (#3132) assigns two same-size tuple types to a same var (#3132) gets size at compile time gets size at compile time codegens splats inside tuples codegens splats inside tuples codegens tuple [0..2] codegens tuple [0..2] codegens tuple metaclass [0..1] codegens tuple metaclass [0..1] upcasts tuple union to compatible tuple upcasts tuple union to compatible tuple codegens tuple [1]? codegens tuple [1]? assigns tuple to compatible tuple assigns tuple to compatible tuple codegens tuple [0] codegens tuple [0] passes empty tuple and empty named tuple to a method (#2852) passes empty tuple and empty named tuple to a method (#2852) provides T as a tuple literal provides T as a tuple literal codegens tuple [0..0] codegens tuple [0..0] codegens tuple metaclass [0..0] codegens tuple metaclass [0..0] codegens tuple [0]? codegens tuple [0]? codegens tuple [0..0]? codegens tuple [0..0]? codegens tuple [2]? codegens tuple [2]? assigns tuple union to compatible tuple assigns tuple union to compatible tuple merges two tuple types of same size (2) merges two tuple types of same size (2) codegens tuple [0..1] codegens tuple [0..1] downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types downcasts union to mixed union with mixed tuple types upcasts tuple inside union to union with compatible tuple upcasts tuple inside union to union with compatible tuple codegens tuple metaclass [1..0] codegens tuple metaclass [1..0] codegens tuple [2..2] codegens tuple [2..2] upcasts tuple inside compatible tuple upcasts tuple inside compatible tuple codegens tuple [1..1]? codegens tuple [1..1]? codegens tuple [-3..2]? codegens tuple [-3..2]? codegens tuple metaclass [3..2]? codegens tuple metaclass [3..2]? codegens tuple [1..0]? codegens tuple [1..0]? assigns tuple inside union to union with compatible tuple assigns tuple inside union to union with compatible tuple codegens tuple [3..2]? codegens tuple [3..2]? codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple union (bug because union size was computed incorrectly) codegens tuple [1] codegens tuple [1] codegens tuple [0..2]? codegens tuple [0..2]? Code gen: next codegens next with break (3) codegens next with break (3) codegens next conditionally codegens next conditionally codegens next codegens next codegens next with break (2) codegens next with break (2) codegens next with break (1) codegens next with break (1) codegens next with while inside block codegens next with while inside block codegens next without expressions codegens next without expressions codegens next conditionally with int type (2) codegens next conditionally with int type (2) 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 access instance variables of original type can access instance variables of original type can call methods of original type can call methods of original type Code gen: named args calls twice with different types calls twice with different types uses bare splat in new (2) uses bare splat in new (2) calls with named arg calls with named arg uses named args in dispatch uses named args in dispatch calls with named arg and other args calls with named arg and other args sends two regular arguments as named arguments in inverted position (1) sends two regular arguments as named arguments in inverted position (1) overloads based on required named args, with restrictions overloads based on required named args, with restrictions sends one regular argument as named argument sends one regular argument as named argument sends two regular arguments as named arguments sends two regular arguments as named arguments sends two regular arguments as named arguments in inverted position (2) sends two regular arguments as named arguments in inverted position (2) calls with named arg as object method calls with named arg as object method calls new with named arg calls new with named arg overloads based on required named args overloads based on required named args Codegen: double splat removes literal types in all matches (#6239) removes literal types in all matches (#6239) double splats named argument with positional arguments double splats named argument with positional arguments double splats named argument with named args (1) double splats named argument with named args (1) double splats named argument into arguments (1) double splats named argument into arguments (1) double splats twice double splats twice matches double splat on method with named args and regular args matches double splat on method with named args and regular args double splats named argument into arguments (2) double splats named argument into arguments (2) matches double splat with regular splat matches double splat with regular splat matches double splat on method with named args matches double splat on method with named args evaluates double splat argument just once (#2677) evaluates double splat argument just once (#2677) double splats named argument with named args (2) double splats named argument with named args (2) Crystal::Doc::MarkdDocRenderer renders html renders "

Foo

" renders "

Foo

" renders links renders "[foo](http://example.com/foo)" renders "[foo](http://example.com/foo)" renders "[`Foo`](http://example.com/foo)" renders "[`Foo`](http://example.com/foo)" renders "[filter](https://docs.celestine.dev/Celestine/Meta/Context.html#filter(&block:Celestine::Filter-%3ECelestine::Filter)-instance-method)" renders "[filter](https://docs.celestine.dev/Celestine/Meta/Context.html#filter(&block:Celestine::Filter-%3ECelestine::Filter)-instance-method)" expand_code_links finds operator method with unspecified args finds operator method with unspecified args finds sibling methods finds sibling methods finds method with question mark finds method with question mark finds constant finds constant finds sibling methods finds sibling methods doesn't find substrings for methods doesn't find substrings for methods finds method of an absolute type finds method of an absolute type finds sibling methods with self receiver finds sibling methods with self receiver doesn't spuriously match range literals doesn't spuriously match range literals does not break when referencing lib type (#9928) does not break when referencing lib type (#9928) doesn't find parents' methods doesn't find parents' methods finds multiple methods with brackets finds multiple methods with brackets doesn't find wrong absolute type doesn't find wrong absolute type doesn't find wrong kind of sibling methods doesn't find wrong kind of sibling methods finds operator method finds operator method finds nested type finds nested type doesn't find method with wrong number of args doesn't find method with wrong number of args doesn't find sibling methods of wrong type doesn't find sibling methods of wrong type finds absolute type finds absolute type finds methods of a type finds methods of a type finds method with args finds method with args finds types from base finds types from base finds method with zero args finds method with zero args doesn't match with different separator doesn't match with different separator doesn't find wrong kind of methods doesn't find wrong kind of methods doesn't find sibling methods with fake receiver doesn't find sibling methods with fake receiver finds types from nested finds types from nested doesn't find method with wrong number of args doesn't find method with wrong number of args doesn't find parents' methods doesn't find parents' methods finds method with unspecified args finds method with unspecified args doesn't find type not at word boundary doesn't find type not at word boundary finds multiple kinds of things finds multiple kinds of things finds method with args even with empty brackets finds method with args even with empty brackets matches methods on single-character class names matches methods on single-character class names finds method with exclamation mark finds method with exclamation mark renders code spans renders "`