Skip to content

Changelog

0.9.0

Released on 2026-05-13.

Adds a large number of new rules and configuration options.

Changes

  • Add support for pFUnit (#636)
  • Add support for pyproject.toml config files (#626)
  • Add --git-staged and --git-since CLI arguments to facilitate incremental linting (#613)
  • Add --diff CLI flag for previewing fix results (#598)
  • Add ignore-comment-length setting for the line-too-long rule (#591)
  • Add allow-bare-use option to exclude modules from the use-all rule (#599)

Rules

  • Upgrade implicit typing rules to catch more edge cases (#616)
  • Add fixes for superfluous-else-* rules (#612)
  • Add rule incorrect_keyword_case (#611)
  • Add rule unsorted-uses (#608)
  • Add rule bare-decimal (#624)
  • Add cyclomatic complexity rule too-complex (#602)
  • Add rule too-many-arguments (#606)
  • Add rule for obsolete arithmetic-if (#603)
  • Add rules for non-block do statements (#604)
  • labelled-do-loop
  • shared-do-termination
  • bad-do-termination
  • goto-end-do
  • Add rules for obsolescent equivalence, block data, and forall (#592)
  • equivalence-statement
  • block-data-construct
  • forall-statement
  • Add rule superfluous-save (#619)
  • Move 34 rules out of preview:
  • avoidable-escaped-quote
  • bad-array-declaration
  • bad-quote-string
  • deprecated-mpi-include
  • deprecated-omp-include
  • double-precision-literal
  • exit-or-cycle-in-unlabelled-loop
  • function-missing-result
  • inconsistent-array-declaration
  • incorrect-space-around-double-colon
  • incorrect-space-between-brackets
  • invalid-character
  • invalid-tab
  • keyword-has-whitespace
  • keywords-missing-space
  • misleading-inline-if-continuation
  • misleading-inline-if-semicolon
  • missing-end-label
  • missing-newline-at-end-of-file
  • mixed-scalar-array-declaration
  • multiple-allocations-with-stat
  • nonportable-shortcircuit-inquiry
  • old-mpi-module
  • out-of-line-attribute
  • pointer-initialisation-in-declaration
  • pointer-initialisation-in-declaration
  • split-escaped-quote
  • stat-without-message
  • superfluous-else-cycle
  • superfluous-else-exit
  • superfluous-else-return
  • superfluous-else-stop
  • unchecked-stat
  • unreachable-statement
  • useless-return

Bug fixes

  • Fix line-too-long for lines exactly on limit (#631)
  • Fix false positive with inline if(...) return in superfluous-else-* rules (S25*) (#595)

Docs

  • Fix explanation of missing-default-pointer-initialisation (#625)
  • Add instructions for using fortitude within the zed editor (#590)

Contributors

0.8.0

Released on 2026-02-05.

Enhancements

  • Improve config file discovery (#537)
  • Add language server (#509)

Rules

  • Add rule missing-newline-at-end-of-file (#552)
  • Add rule unreachable-statement (#563)
  • Add rulesuseless-return and superfluous-else-return/cycle/exit/stop (#553)
  • Add rules for declaring arrays (#562)
  • Add rules for nonconforming characters and tabs (#522)
  • Add unsafe fix for implicit-typing, and check non-module procedures (#518)
  • Add rule out-of-line-attribute (#558)
  • Move 15 rules out of --preview mode:
  • missing-default-case
  • magic-number-in-array-size
  • magic-io-unit
  • missing-action-specifier
  • trailing-backslash
  • missing-default-pointer-initialisation
  • missing-intrinsic
  • include-statement
  • non-portable-io-unit
  • superfluous-semicolon
  • multiple-statements-per-line
  • multiple-modules
  • program-with-module
  • specific-name
  • computed-go-to
  • Fix incorrect-space-before-comment span to point at whitespace (#581)
  • Fix missing-intent for external dummy arguments (#580)

CLI / Configuration

  • Add more capabilities to fortitude explain (#542)
  • Add fortitude config command (#540)
  • Add --isolated option, and user-specific config files (#535)
  • Add --target-std option (#551)
  • Add top-level include option; deprecate files/file_extensions (#534)

Bug fixes

  • Always report fixes, even if no violations left (#541)
  • Fix version command for changed crates/ layout (#511)
  • Fix GitLab output format (#494)

Documentation

  • General overhaul of documentation (#521)
  • Add Fortitude logo (#554)
  • Document install location (#539)
  • Improve contributing docs (#543)
  • Improve visibility of .fortitude.toml config file (#532)
  • Add Options management flowchart to docs (#550)
  • Add note about assumed-size-character-intent with UDTIO (#576)
  • Add some users of Fortitude (#587)
  • Expand docs for missing-default-case (#586)
  • Fix broken editors link in README (#572)

Miscellaneous

  • Reduce minimal Python version to 3.7 (#538)
  • Allow some exceptions to line-too-long (#582)
  • Disable fix reports when syntax errors are present (#577)

Contributors

0.8.0rc1

Released on 2025-12-19.

Enhancements

  • Improve config file discovery (#537)
  • Add language server (#509)

Rules

  • Add rule missing-newline-at-end-of-file (#552)
  • Add rule unreachable-statement (#563)
  • Add rulesuseless-return and superfluous-else-return/cycle/exit/stop (#553)
  • Add rules for declaring arrays (#562)
  • Add rules for nonconforming characters and tabs (#522)
  • Add unsafe fix for implicit-typing, and check non-module procedures (#518)
  • Add rule out-of-line-attribute (#558)
  • Move 15 rules out of --preview mode:
  • missing-default-case
  • magic-number-in-array-size
  • magic-io-unit
  • missing-action-specifier
  • trailing-backslash
  • missing-default-pointer-initialisation
  • missing-intrinsic
  • include-statement
  • non-portable-io-unit
  • superfluous-semicolon
  • multiple-statements-per-line
  • multiple-modules
  • program-with-module
  • specific-name
  • computed-go-to

CLI / Configuration

  • Add more capabilities to fortitude explain (#542)
  • Add fortitude config command (#540)
  • Add --isolated option, and user-specific config files (#535)
  • Add --target-std option (#551)
  • Add top-level include option; deprecate files/file_extensions (#534)

Bug fixes

  • Always report fixes, even if no violations left (#541)
  • Fix version command for changed crates/ layout (#511)
  • Fix GitLab output format (#494)

Documentation

  • General overhaul of documentation (#521)
  • Add Fortitude logo (#554)
  • Document install location (#539)
  • Improve contributing docs (#543)
  • Improve visibility of .fortitude.toml config file (#532)
  • Add Options management flowchart to docs (#550)

Miscellaneous

  • Reduce minimal Python version to 3.7 (#538)

Contributors

0.7.5

Bug fixes

  • Fix fmt argument in IO statements (#491)

0.7.4

Rule changes

  • Add rule avoidable-escaped-quote (#446)
  • Add rule incorrect-space-around-double-colon (#457)
  • Add rule incorrect-space-between-brackets (#460)
  • Add rule multiple-allocations-with-stat (#466)
  • Add rule stat-without-message (#468)
  • Add rule unchecked-stat (#458)
  • Add rules to detect deprecated and discouraged OpenMP and MPI uses (#478)
  • Rename single-quote-string to bad-quote-string, add option to toggle preference (#445)
  • Preserve existing case for unnamed-end-statement (#442)
  • Catch stderr and Cray file units in non-portable-io-unit (#450)
  • Fix non-portable-io-unit triggering on any magic number (#447)

Documentation

  • Fix typo in setting variable names (#448)
  • Clarify file filtering behaviour (#476)
  • Add search plugin (#483)
  • Add hint to nvim-lint for neovim (#482)
  • Small clarification on technical details of intent(out) (#451)

Other changes

  • Bump tree-sitter-fortran version (#462)

0.7.3

This release adds 5 new rules along with some minor bug fixes and other improvements.

Rule changes

  • Add rule missing-end-label (#407)
  • Add rule single-quote-string (#423)
  • Add rule misleading-inline-if-semicolon (#426)
  • Add rule misleading-inline-if-continuation (#428)
  • Add rule nonportable-shortcircuit-inquiry (#431)
  • Add rule split-escaped-quote (#438)
  • Permit value dummy args in missing-intent (#421)

Bug fixes

  • Don't raise SyntaxError for missing nodes if rule not enabled (#430)

Documentation

  • Clarify line-too-long behaviour for long strings and comments (#434)

0.7.2

Rule changes

  • Add rule double-precision-literal (#390)
  • Add rule to detect missing function result clause (#386)
  • Add rule to flag implicit save in pointer initialization (#396)
  • Add rules preferring multi-word keywords to include spaces (#393)

Documentation

  • Fix fpm.toml examples in docs/settings.md (#387)

Other changes

  • Raise SyntaxError for missing nodes (#394)

0.7.1

This is a bug-fix release, with one new rule. Thanks to our new contributors for improving the documentation, and packaging for AUR!

Rule changes

  • Add rule for exit/cycle in unlabelled loop (#364)
  • Expand rule for character*(*) to handle character*N, character*(:), and character*(expression) (#354)

Bug fixes

  • Don't print diagnostics in --fix-only mode (#359)
  • Fix --statistics reporting for unsafe fixes (#368)
  • Fix false positive real-implicit-kind in type declaration (#378)
  • Move default-public-accessibility highlight to public statement (#351)
  • Write to stdout even when no fixes are applied in stdin mode (#358)

Documentation

  • Update introduction to README.dev.md (#360)
  • docs(index): fix link to best practices (#350)
  • docs: add package manager install instructions (#377)
  • docs: fix links to best practice (#357)
  • fixing some spelling and grammar (#352)

Other changes

  • Add pre-commit hooks (#376)

0.7.0

This release features 25 new rules, many more options for controlling exactly which rules are enabled anywhere from per-file to per-line, and some useful command line options.

Breaking changes

We've reorganised a lot of the rules and categories. Rule and category redirects should minimise any breakages, but you should update your config appropriately.

We have also changed the rules that are on by default. This may mean you now have to explicitly enable some rules there were previously checked, and you may find more warnings being raised from new rules.

The rule statement-function has been temporarily removed while we work to reduce false positives.

Stabilisation

The following rules have been stabilised and are no longer in preview:

Rule changes

  • Add missing-default-case (#240)
  • Add check for use of specific names for intrinsic functions (#254)
  • Add rule magic-number-in-array-size (#236)
  • Add rule missing-action-specifier and Io rule category (#230)
  • Add rule for deleted feature pause statements (#304)
  • Add rule to find computed go to statements (#264)
  • Add rule to find missing intrinsic specifiers in use statements (#253)
  • Add rule to flag trailing backslash (#311)
  • Add rule to test for uninitialized pointers in derived types (#299)
  • Add rules for magic/non-portable IO units (#239)
  • Add rules for multiple modules/programs in same file; Add rule for include statements (#268)
  • Add rules for unused/duplicated/redirected allow comments (#334)
  • Rule: multiple-statements-per-line (#246)
  • Temporarily remove statement-function (#339)
  • Warn about invalid rules in allow-comments (#266)
  • Suggest iso_fortran_env parameters for literal kinds (#245)

CLI

  • Add --exit-zero and --exit-non-zero-on-fix CLI options (#328)
  • Add --statistics CLI flag to show counts of violations (#330)
  • Add ability to read from stdin (#307)
  • Add command to generate shell completion scripts (#340)
  • Add logging framework and --verbose/quiet/silent flags (#274)

Configuration

  • Add "allow" comments (#242)
  • Add options to exclude files (#238)
  • Add per-file-ignores (#232)
  • Decouple CLI and config file (#312)
  • Mark rules as Default or Optional in map_codes (#324)
  • Recategorise rules (#329)
  • Respect .gitignore (#285)
  • Warn when selected rules are ignored for some reason (#305)

Bug fixes

  • Bugfix: Catch negative exponents in missing-kind-suffix (#244)
  • Bugfix: Count files scanned and files skipped correctly (#309)
  • Bugfix: line-length and file-extensions ignored in toml files (#251)
  • Bugfix: fix get_files force excluding with directories (#296)
  • Bugfix: make specific-names an unsafe fix (#263)
  • Catch syntax errors introduced by fixes (#227)
  • Don't raise linter violations or apply fixes when syntax errors are detected (#336)
  • Fix Windows testing issues (#318)
  • Fix some issues with newlines in fixes on Windows (#315)
  • Handle broken pipes (#290)

Documentation

  • Add guide for adding new rules to README.dev.md (#300)
  • T042: Fix example code in assumed-size-character-intent rule (#234)

0.6.2

Bug fixes

  • Fix Node::edit_replacement eating newlines (#225)

0.6.1

Bug fixes

  • Bugfix: star-kind fix set to unsafe (#218)

Documentation

  • Fix link to rules table in Readme (#217)

0.6.0

Preview features

  • Move statement-function rule to preview set (#164)

Rule changes

  • Add automatic fixes (#181)
  • Add check for external procedures (#195)
  • Add fix for deprecated-relational-operators (#182)
  • Add fix for old-style-array-literal (#183)
  • Add fix for star-kinds (#186)
  • Add fix for trailing-whitespace (#187)
  • Add fix for unnamed-end-statement (#185)
  • Add fix for missing label on exit/cycle (#184)
  • Add rule common-block (#165)
  • Add rule for implicit external procedures (#192)
  • Add rule for incorrect whitespace before comment (#194)
  • Add rule for missing private statements in modules (#150)
  • Add rule for missing double-colon in variable decls (#171)
  • Add rule for obsolescent entry statement (#169)
  • Add rule for statement functions (#162)
  • Rename external-function to procedure-not-in-module (#200)

CLI

  • Add --preview option (#151)
  • Add fancy progress bar (#145)
  • Don't require argument for CLI --preview (#153)
  • Print git commit and extra info with --version (#174)
  • Show preview rules in explain (#154)

Configuration

  • Add (many) more output formats (#177)

Bug fixes

  • Bugfix: DiagnosticMessages were created on pre-transformed file (#191)
  • Bugfix: report number of files scanned (#173)
  • Bugfix: utf-8 multi-byte characters breaking diagnostic output (#198)
  • Less aggressive warnings for no-real-suffix (#156)

Documentation

  • Add basic docs (#210)

0.5.1

Performance

  • Better parallel performance (#137)

Bug fixes

  • Don't warn on missing intent for procedure arguments (#139)

Documentation

  • Clarify check help text for recursive file searches (#143)

0.5.0

Performance

  • Parallelise check (#129)

CLI

  • Add a success message when all checks are passed and a summary of number of files scanned (#104)
  • Make explain arguments positional (#113)
  • Select categories by name (#112)
  • Select rules by name (#111)

Bug fixes

  • Add fix for superfluous implicit none (#99)
  • Fix explain bug with RuleSelector, improve explain output (#110)
  • Fix reading config files (#124)
  • Remove deleted flag from help text (#115)

Documentation

  • Update precision explanations (#126)
  • docs: Clarify how check searches for files (#128)

Other changes

  • Enable more sophisticated rule selection (#108)

0.4.0

Configuration

  • Add setting for file extensions to check (#89)
  • Add support for config files (#87)

0.3.0

Rule changes

  • Add check for old-style array literals (/.../) (#54)
  • Add rule for assumed size dummy arguments (#57)
  • Add rule for deprecated relational operators (#82)
  • Add rule for initialisation in declarations (#72)
  • Add rule for missing intent attribute (#50)
  • Add rule for missing label on exit/cycle (#53)
  • Add rule for non-explicit end statements (#84)
  • Add rules for character assumed size issues (#75)
  • Implicit real kinds rule (#81)
  • Print context of violations (#45)

Bug fixes

  • Bugfix: newline printed for files without rule violations (#42)

0.2.0