Marge Bot pushed to branch wip/marge_bot_batch_merge_job at Glasgow Haskell Compiler / GHC Commits: 5f977ca6 by Bryan Richter at 2025-06-04T15:24:18-04:00 CI: Fix and clean up capture of timings * Fixes the typo that caused 'cat ci-timings' to report "no such file or directory" * Gave ci_timings.txt a file extension so it may play better with other systems * Fixed the use of time_it so all times are recorded * Fixed time_it to print name along with timing - - - - - e1a3a80c by Bryan Richter at 2025-06-04T15:24:18-04:00 CI: Update collapsible section usage The syntax apparently changed at some point. - - - - - 95ef5507 by Bryan Richter at 2025-06-04T15:24:18-04:00 CI: Add more collapsible sections - - - - - 619c0de1 by Ben Gamari at 2025-06-04T15:24:19-04:00 hadrian: Place user options after package arguments This makes it easier for the user to override the default package arguments with `UserSettings.hs`. Fixes #25821. - - - - - 83f944f6 by Ryan Hendrickson at 2025-06-04T15:24:23-04:00 haddock: Parse math even after ordinary characters Fixes a bug where math sections were not recognized if preceded by a character that isn't special (like space or a markup character). - - - - - 6e8408be by ARATA Mizuki at 2025-06-04T15:24:28-04:00 AArch64 NCG: Fix sub-word arithmetic right shift As noted in Note [Signed arithmetic on AArch64], we should zero-extend sub-word values. Fixes #26061 - - - - - d99c4230 by ARATA Mizuki at 2025-06-04T15:24:32-04:00 x86 NCG: Fix code generation of bswap64 on i386 Co-authored-by: sheaf <sam.derbyshire@gmail.com> Fix #25601 - - - - - 17 changed files: - .gitlab-ci.yml - .gitlab/ci.sh - .gitlab/common.sh - .gitlab/generate-ci/gen_ci.hs - .gitlab/jobs.yaml - compiler/GHC/CmmToAsm/AArch64/CodeGen.hs - compiler/GHC/CmmToAsm/X86/CodeGen.hs - hadrian/src/Settings.hs - + testsuite/tests/cmm/should_run/T25601.hs - + testsuite/tests/cmm/should_run/T25601.stdout - + testsuite/tests/cmm/should_run/T25601a.cmm - testsuite/tests/cmm/should_run/all.T - + testsuite/tests/codeGen/should_run/T26061.hs - + testsuite/tests/codeGen/should_run/T26061.stdout - testsuite/tests/codeGen/should_run/all.T - utils/haddock/haddock-library/src/Documentation/Haddock/Parser.hs - utils/haddock/haddock-library/test/Documentation/Haddock/ParserSpec.hs Changes: ===================================== .gitlab-ci.yml ===================================== @@ -367,7 +367,7 @@ lint-submods-branch: - .gitlab/ci.sh setup after_script: - .gitlab/ci.sh save_cache - - cat ci-timings + - cat ci_timings.txt variables: GHC_FLAGS: -Werror cache: @@ -419,7 +419,7 @@ hadrian-ghc-in-ghci: - echo ":q" | HADRIAN_ARGS=-j$CORES hadrian/ghci -j$CORES | tail -n2 | grep "Ok," after_script: - .gitlab/ci.sh save_cache - - cat ci-timings + - cat ci_timings.txt cache: key: hadrian-ghci-$CACHE_REV paths: ===================================== .gitlab/ci.sh ===================================== @@ -34,7 +34,11 @@ function time_it() { local delta=$(expr $end - $start) echo "$name took $delta seconds" - printf "%15s | $delta" > ci-timings + if [[ ! -e ci_timings.txt ]]; then + echo "=== TIMINGS ===" > ci_timings.txt + fi + + printf "%15s | $delta\n" $name >> ci_timings.txt return $res } @@ -239,8 +243,6 @@ function cabal_update() { # Extract GHC toolchain function setup() { - echo "=== TIMINGS ===" > ci-timings - if [ -d "$CABAL_CACHE" ]; then info "Extracting cabal cache from $CABAL_CACHE to $CABAL_DIR..." mkdir -p "$CABAL_DIR" @@ -279,7 +281,7 @@ function fetch_ghc() { fail "neither GHC nor GHC_VERSION are not set" fi - start_section "fetch GHC" + start_section fetch-ghc "Fetch GHC" url="https://downloads.haskell.org/~ghc/${GHC_VERSION}/ghc-${GHC_VERSION}-${boot_triple}.tar.xz" info "Fetching GHC binary distribution from $url..." curl "$url" > ghc.tar.xz || fail "failed to fetch GHC binary distribution" @@ -296,7 +298,7 @@ function fetch_ghc() { ;; esac rm -Rf "ghc-${GHC_VERSION}" ghc.tar.xz - end_section "fetch GHC" + end_section fetch-ghc fi } @@ -308,7 +310,7 @@ function fetch_cabal() { fail "neither CABAL nor CABAL_INSTALL_VERSION are not set" fi - start_section "fetch cabal" + start_section fetch-cabal "Fetch Cabal" case "$(uname)" in # N.B. Windows uses zip whereas all others use .tar.xz MSYS_*|MINGW*) @@ -341,7 +343,7 @@ function fetch_cabal() { fi ;; esac - end_section "fetch cabal" + end_section fetch-cabal fi } @@ -349,6 +351,7 @@ function fetch_cabal() { # here. For Docker platforms this is done in the Docker image # build. function setup_toolchain() { + start_section setup-toolchain "Setup toolchain" fetch_ghc fetch_cabal cabal_update @@ -371,10 +374,11 @@ function setup_toolchain() { info "Building alex..." $cabal_install alex --constraint="alex>=$MIN_ALEX_VERSION" + end_section setup-toolchain } function cleanup_submodules() { - start_section "clean submodules" + start_section clean-submodules "Clean submodules" if [ -d .git ]; then info "Cleaning submodules..." # On Windows submodules can inexplicably get into funky states where git @@ -386,7 +390,7 @@ function cleanup_submodules() { else info "Not cleaning submodules, not in a git repo" fi; - end_section "clean submodules" + end_section clean-submodules } function configure() { @@ -486,6 +490,8 @@ function check_release_build() { } function build_hadrian() { + start_section build-hadrian "Build via Hadrian" + if [ -z "${BIN_DIST_NAME:-}" ]; then fail "BIN_DIST_NAME not set" fi @@ -519,7 +525,7 @@ function build_hadrian() { ;; esac fi - + end_section build-hadrian } # run's `make DESTDIR=$1 install` and then @@ -545,6 +551,7 @@ function make_install_destdir() { # install the binary distribution in directory $1 to $2. function install_bindist() { + start_section install-bindist "Install bindist" case "${CONFIGURE_WRAPPER:-}" in emconfigure) source "$EMSDK/emsdk_env.sh" ;; *) ;; @@ -584,9 +591,11 @@ function install_bindist() { ;; esac popd + end_section install-bindist } function test_hadrian() { + start_section test-hadrian "Test via Hadrian" check_msys2_deps _build/stage1/bin/ghc --version check_release_build @@ -708,6 +717,7 @@ function test_hadrian() { info "STAGE2_TEST=$?" fi + end_section test-hadrian } function summarise_hi_files() { @@ -742,7 +752,7 @@ function cabal_abi_test() { pushd $DIR echo $PWD - start_section "Cabal test: $OUT" + start_section cabal-abi-test "Cabal ABI test: $OUT" mkdir -p "$OUT" "$HC" \ -hidir tmp -odir tmp -fforce-recomp -haddock \ @@ -752,7 +762,7 @@ function cabal_abi_test() { summarise_hi_files summarise_o_files popd - end_section "Cabal test: $OUT" + end_section cabal-abi-test } function cabal_test() { @@ -760,7 +770,7 @@ function cabal_test() { fail "OUT not set" fi - start_section "Cabal test: $OUT" + start_section cabal-test "Cabal test: $OUT" mkdir -p "$OUT" run "$HC" \ -hidir tmp -odir tmp -fforce-recomp \ @@ -769,7 +779,7 @@ function cabal_test() { -ilibraries/Cabal/Cabal/src -XNoPolyKinds Distribution.Simple \ "$@" 2>&1 | tee $OUT/log rm -Rf tmp - end_section "Cabal test: $OUT" + end_section cabal-test } function run_perf_test() { ===================================== .gitlab/common.sh ===================================== @@ -20,15 +20,18 @@ WHITE="1;37" LT_GRAY="0;37" # GitLab Pipelines log section delimiters -# https://gitlab.com/gitlab-org/gitlab-foss/issues/14664 -start_section() { - name="$1" - echo -e "section_start:$(date +%s):$name\015\033[0K" +# https://docs.gitlab.com/ci/jobs/job_logs/#custom-collapsible-sections +function start_section () { + local section_title="${1}" + local section_description="${2:-$section_title}" + + echo -e "section_start:$(date +%s):${section_title}[collapsed=true]\r\e[0K${section_description}" } -end_section() { - name="$1" - echo -e "section_end:$(date +%s):$name\015\033[0K" +function end_section () { + local section_title="${1}" + + echo -e "section_end:$(date +%s):${section_title}\r\e[0K" } echo_color() { ===================================== .gitlab/generate-ci/gen_ci.hs ===================================== @@ -870,7 +870,7 @@ job arch opsys buildConfig = NamedJob { name = jobName, jobInfo = Job {..} } [ ".gitlab/ci.sh save_cache" , ".gitlab/ci.sh save_test_output" , ".gitlab/ci.sh clean" - , "cat ci_timings" + , "cat ci_timings.txt" ] jobFlavour = mkJobFlavour buildConfig ===================================== .gitlab/jobs.yaml ===================================== @@ -5,7 +5,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -71,7 +71,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -134,7 +134,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -196,7 +196,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -258,7 +258,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -482,7 +482,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -545,7 +545,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -607,7 +607,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -669,7 +669,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -736,7 +736,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -800,7 +800,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -863,7 +863,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -926,7 +926,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1153,7 +1153,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -1217,7 +1217,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1280,7 +1280,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1343,7 +1343,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1413,7 +1413,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1479,7 +1479,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -1543,7 +1543,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1607,7 +1607,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1671,7 +1671,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1735,7 +1735,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1800,7 +1800,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1865,7 +1865,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1930,7 +1930,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -1993,7 +1993,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2056,7 +2056,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2121,7 +2121,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2187,7 +2187,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2250,7 +2250,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2313,7 +2313,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -2376,7 +2376,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2440,7 +2440,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2503,7 +2503,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2568,7 +2568,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2631,7 +2631,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2694,7 +2694,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2757,7 +2757,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2820,7 +2820,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -2885,7 +2885,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -2948,7 +2948,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3011,7 +3011,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3076,7 +3076,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3142,7 +3142,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3207,7 +3207,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3270,7 +3270,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3333,7 +3333,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3396,7 +3396,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3459,7 +3459,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3587,7 +3587,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3776,7 +3776,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3844,7 +3844,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3909,7 +3909,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -3973,7 +3973,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4037,7 +4037,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -4102,7 +4102,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4166,7 +4166,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4230,7 +4230,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4301,7 +4301,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4368,7 +4368,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -4433,7 +4433,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4498,7 +4498,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4563,7 +4563,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4628,7 +4628,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4692,7 +4692,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4756,7 +4756,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4820,7 +4820,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4884,7 +4884,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -4948,7 +4948,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5014,7 +5014,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5080,7 +5080,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5147,7 +5147,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5211,7 +5211,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5275,7 +5275,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5339,7 +5339,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5403,7 +5403,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5467,7 +5467,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5659,7 +5659,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5728,7 +5728,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5793,7 +5793,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -5856,7 +5856,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5919,7 +5919,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -5982,7 +5982,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6045,7 +6045,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6109,7 +6109,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6174,7 +6174,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6239,7 +6239,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6301,7 +6301,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6363,7 +6363,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6427,7 +6427,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6492,7 +6492,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6554,7 +6554,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6616,7 +6616,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6679,7 +6679,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6742,7 +6742,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6804,7 +6804,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6868,7 +6868,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6930,7 +6930,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -6992,7 +6992,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7054,7 +7054,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7116,7 +7116,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": true, "artifacts": { @@ -7181,7 +7181,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7243,7 +7243,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7305,7 +7305,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7369,7 +7369,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7434,7 +7434,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7498,7 +7498,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7560,7 +7560,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7622,7 +7622,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7684,7 +7684,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7746,7 +7746,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { @@ -7872,7 +7872,7 @@ ".gitlab/ci.sh save_cache", ".gitlab/ci.sh save_test_output", ".gitlab/ci.sh clean", - "cat ci_timings" + "cat ci_timings.txt" ], "allow_failure": false, "artifacts": { ===================================== compiler/GHC/CmmToAsm/AArch64/CodeGen.hs ===================================== @@ -928,21 +928,25 @@ getRegister' config plat expr CmmMachOp (MO_S_Shr w) [x, (CmmLit (CmmInt n _))] | w == W8, 0 <= n, n < 8 -> do (reg_x, _format_x, code_x) <- getSomeReg x - return $ Any (intFormat w) (\dst -> code_x `snocOL` annExpr expr (SBFX (OpReg w dst) (OpReg w reg_x) (OpImm (ImmInteger n)) (OpImm (ImmInteger (8-n))))) + return $ Any (intFormat w) (\dst -> code_x `snocOL` annExpr expr (SBFX (OpReg w dst) (OpReg w reg_x) (OpImm (ImmInteger n)) (OpImm (ImmInteger (8-n)))) + `snocOL` (UXTB (OpReg w dst) (OpReg w dst))) -- See Note [Signed arithmetic on AArch64] CmmMachOp (MO_S_Shr w) [x, y] | w == W8 -> do (reg_x, _format_x, code_x) <- getSomeReg x (reg_y, _format_y, code_y) <- getSomeReg y return $ Any (intFormat w) (\dst -> code_x `appOL` code_y `snocOL` annExpr expr (SXTB (OpReg w reg_x) (OpReg w reg_x)) `snocOL` - (ASR (OpReg w dst) (OpReg w reg_x) (OpReg w reg_y))) + (ASR (OpReg w dst) (OpReg w reg_x) (OpReg w reg_y)) `snocOL` + (UXTB (OpReg w dst) (OpReg w dst))) -- See Note [Signed arithmetic on AArch64] CmmMachOp (MO_S_Shr w) [x, (CmmLit (CmmInt n _))] | w == W16, 0 <= n, n < 16 -> do (reg_x, _format_x, code_x) <- getSomeReg x - return $ Any (intFormat w) (\dst -> code_x `snocOL` annExpr expr (SBFX (OpReg w dst) (OpReg w reg_x) (OpImm (ImmInteger n)) (OpImm (ImmInteger (16-n))))) + return $ Any (intFormat w) (\dst -> code_x `snocOL` annExpr expr (SBFX (OpReg w dst) (OpReg w reg_x) (OpImm (ImmInteger n)) (OpImm (ImmInteger (16-n)))) + `snocOL` (UXTH (OpReg w dst) (OpReg w dst))) -- See Note [Signed arithmetic on AArch64] CmmMachOp (MO_S_Shr w) [x, y] | w == W16 -> do (reg_x, _format_x, code_x) <- getSomeReg x (reg_y, _format_y, code_y) <- getSomeReg y return $ Any (intFormat w) (\dst -> code_x `appOL` code_y `snocOL` annExpr expr (SXTH (OpReg w reg_x) (OpReg w reg_x)) `snocOL` - (ASR (OpReg w dst) (OpReg w reg_x) (OpReg w reg_y))) + (ASR (OpReg w dst) (OpReg w reg_x) (OpReg w reg_y)) `snocOL` + (UXTH (OpReg w dst) (OpReg w dst))) -- See Note [Signed arithmetic on AArch64] CmmMachOp (MO_S_Shr w) [x, (CmmLit (CmmInt n _))] | w == W32 || w == W64 ===================================== compiler/GHC/CmmToAsm/X86/CodeGen.hs ===================================== @@ -6067,10 +6067,23 @@ genByteSwap width dst src = do W64 | is32Bit -> do let Reg64 dst_hi dst_lo = localReg64 dst RegCode64 vcode rhi rlo <- iselExpr64 src - return $ vcode `appOL` - toOL [ MOV II32 (OpReg rlo) (OpReg dst_hi), - MOV II32 (OpReg rhi) (OpReg dst_lo), - BSWAP II32 dst_hi, + tmp <- getNewRegNat II32 + -- Swap the low and high halves of the register. + -- + -- NB: if dst_hi == rhi, we must make sure to preserve the contents + -- of rhi before writing to dst_hi (#25601). + let shuffle = if dst_hi == rhi && dst_lo == rlo then + toOL [ MOV II32 (OpReg rhi) (OpReg tmp), + MOV II32 (OpReg rlo) (OpReg dst_hi), + MOV II32 (OpReg tmp) (OpReg dst_lo) ] + else if dst_hi == rhi then + toOL [ MOV II32 (OpReg rhi) (OpReg dst_lo), + MOV II32 (OpReg rlo) (OpReg dst_hi) ] + else + toOL [ MOV II32 (OpReg rlo) (OpReg dst_hi), + MOV II32 (OpReg rhi) (OpReg dst_lo) ] + return $ vcode `appOL` shuffle `appOL` + toOL [ BSWAP II32 dst_hi, BSWAP II32 dst_lo ] W16 -> do let dst_r = getLocalRegReg dst ===================================== hadrian/src/Settings.hs ===================================== @@ -35,7 +35,7 @@ getExtraArgs :: Args getExtraArgs = expr flavour >>= extraArgs getArgs :: Args -getArgs = mconcat [ defaultBuilderArgs, getExtraArgs, defaultPackageArgs ] +getArgs = mconcat [ defaultBuilderArgs, defaultPackageArgs, getExtraArgs ] getLibraryWays :: Ways getLibraryWays = expr flavour >>= libraryWays ===================================== testsuite/tests/cmm/should_run/T25601.hs ===================================== @@ -0,0 +1,22 @@ +{-# LANGUAGE UnboxedTuples #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE ForeignFunctionInterface #-} +{-# LANGUAGE GHCForeignImportPrim #-} +{-# LANGUAGE UnliftedFFITypes #-} + +import Numeric +import GHC.Prim +import GHC.Word +import GHC.IO +import GHC.Ptr +import Data.List +import qualified Data.ByteString as BS + +foreign import prim "test" c_test :: Addr# -> State# RealWorld -> (# State# RealWorld, Word64# #) + +main :: IO () +main = do + let bs = BS.pack $ take 100000 [ fromIntegral i | i <- [(1 :: Int) ..] ] + n <- BS.useAsCString bs $ \(Ptr addr) -> IO $ \s -> + case c_test addr s of (# s', n #) -> (# s', W64# n #) + print $ showHex n "" ===================================== testsuite/tests/cmm/should_run/T25601.stdout ===================================== @@ -0,0 +1 @@ +"f3f1ffffffffffff" ===================================== testsuite/tests/cmm/should_run/T25601a.cmm ===================================== @@ -0,0 +1,7 @@ +#include "Cmm.h" + +test ( W_ buffer ) { + bits64 ret; + (ret) = prim %bswap64(%neg(%zx64(bits16[buffer + (12 :: W_)]))); + return (ret); +} ===================================== testsuite/tests/cmm/should_run/all.T ===================================== @@ -47,3 +47,8 @@ test('AtomicFetch', ], multi_compile_and_run, ['AtomicFetch', [('AtomicFetch_cmm.cmm', '')], '']) + +test('T25601', + [req_cmm], + multi_compile_and_run, + ['T25601', [('T25601a.cmm', '')], '']) ===================================== testsuite/tests/codeGen/should_run/T26061.hs ===================================== @@ -0,0 +1,41 @@ +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE ExtendedLiterals #-} +import GHC.Word +import GHC.Exts + +f :: Int16# -> Word16# +f x = let !w = int16ToWord16# (x `uncheckedShiftRAInt16#` 1#) + in w `remWord16#` 13#Word16 +{-# NOINLINE f #-} + +g :: Int8# -> Word8# +g x = let !w = int8ToWord8# (x `uncheckedShiftRAInt8#` 1#) + in w `remWord8#` 19#Word8 +{-# NOINLINE g #-} + +h :: Int16# -> Int# -> Word16# +h x y = let !w = int16ToWord16# (x `uncheckedShiftRAInt16#` y) + in w `remWord16#` 13#Word16 +{-# NOINLINE h #-} + +i :: Int8# -> Int# -> Word8# +i x y = let !w = int8ToWord8# (x `uncheckedShiftRAInt8#` y) + in w `remWord8#` 19#Word8 +{-# NOINLINE i #-} + +main :: IO () +main = do + print (W16# (f (-100#Int16))) + print (W8# (g (-100#Int8))) + print (W16# (h (-100#Int16) 1#)) + print (W8# (i (-100#Int8) 1#)) + +-- int16ToWord16 (-100 `shiftR` 1) `rem` 13 +-- = int16ToWord16 (-50) `rem` 13 +-- = 65486 `rem` 13 +-- = 5 + +-- int8ToWord8 (-100 `shiftR` 1) `rem` 19 +-- = int8ToWord8 (-50) `rem` 19 +-- = 206 `rem` 19 +-- = 16 ===================================== testsuite/tests/codeGen/should_run/T26061.stdout ===================================== @@ -0,0 +1,4 @@ +5 +16 +5 +16 ===================================== testsuite/tests/codeGen/should_run/all.T ===================================== @@ -255,3 +255,4 @@ test('T24893', normal, compile_and_run, ['-O']) test('CCallConv', [req_c], compile_and_run, ['CCallConv_c.c']) test('T25364', normal, compile_and_run, ['']) +test('T26061', normal, compile_and_run, ['']) ===================================== utils/haddock/haddock-library/src/Documentation/Haddock/Parser.hs ===================================== @@ -1,3 +1,4 @@ +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ViewPatterns #-} @@ -28,6 +29,7 @@ import Control.Applicative import Control.Arrow (first) import Control.Monad import Data.Char (chr, isAlpha, isSpace, isUpper) +import Data.Functor (($>)) import Data.List (elemIndex, intercalate, intersperse, unfoldr) import Data.Maybe (fromMaybe, mapMaybe) import Data.Monoid @@ -186,11 +188,29 @@ specialChar = "_/<@\"&'`#[ " -- to ensure that we have already given a chance to more meaningful parsers -- before capturing their characters. string' :: Parser (DocH mod a) -string' = DocString . unescape . T.unpack <$> takeWhile1_ (`notElem` specialChar) +string' = + DocString + <$> ((:) <$> rawOrEscChar "" <*> many (rawOrEscChar "([")) + -- After the first character, stop for @\(@ or @\[@ math starters. (The + -- first character won't start a valid math string because this parser + -- should follow math parsers. But this parser is expected to accept at + -- least one character from all inputs that don't start with special + -- characters, so the first character parser can't have the @"(["@ + -- restriction.) where - unescape "" = "" - unescape ('\\' : x : xs) = x : unescape xs - unescape (x : xs) = x : unescape xs + -- | Parse a single logical character, either raw or escaped. Don't accept + -- escaped characters from the argument string. + rawOrEscChar :: [Char] -> Parser Char + rawOrEscChar restrictedEscapes = try $ Parsec.noneOf specialChar >>= \case + -- Handle backslashes: + -- - Fail on forbidden escape characters. + -- - Non-forbidden characters: simply unescape, e.g. parse "\b" as 'b', + -- - Trailing backslash: treat it as a raw backslash, not an escape + -- sequence. (This is the logic that this parser followed when this + -- comment was written; it is not necessarily intentional but now I + -- don't want to break anything relying on it.) + '\\' -> Parsec.noneOf restrictedEscapes <|> Parsec.eof $> '\\' + c -> pure c -- | Skips a single special character and treats it as a plain string. -- This is done to skip over any special characters belonging to other ===================================== utils/haddock/haddock-library/test/Documentation/Haddock/ParserSpec.hs ===================================== @@ -284,6 +284,13 @@ spec = do it "supports title for deprecated picture syntax" $ do "<<b a z>>" `shouldParseTo` image "b" "a z" + context "when parsing inline math" $ do + it "accepts inline math immediately after punctuation" $ do + "(\\(1 + 2 = 3\\) is an example of addition)" + `shouldParseTo` "(" + <> DocMathInline "1 + 2 = 3" + <> " is an example of addition)" + context "when parsing display math" $ do it "accepts markdown syntax for display math containing newlines" $ do "\\[\\pi\n\\pi\\]" `shouldParseTo` DocMathDisplay "\\pi\n\\pi" View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/d1c1985989b538a7b2f2f513d7ca1a3... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/d1c1985989b538a7b2f2f513d7ca1a3... You're receiving this email because of your account on gitlab.haskell.org.
participants (1)
-
Marge Bot (@marge-bot)