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.tomlconfig files (#626) - Add
--git-stagedand--git-sinceCLI arguments to facilitate incremental linting (#613) - Add
--diffCLI flag for previewing fix results (#598) - Add
ignore-comment-lengthsetting for theline-too-longrule (#591) - Add
allow-bare-useoption to exclude modules from theuse-allrule (#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
dostatements (#604) labelled-do-loopshared-do-terminationbad-do-terminationgoto-end-do- Add rules for obsolescent
equivalence,block data, andforall(#592) equivalence-statementblock-data-constructforall-statement- Add rule
superfluous-save(#619) - Move 34 rules out of preview:
avoidable-escaped-quotebad-array-declarationbad-quote-stringdeprecated-mpi-includedeprecated-omp-includedouble-precision-literalexit-or-cycle-in-unlabelled-loopfunction-missing-resultinconsistent-array-declarationincorrect-space-around-double-colonincorrect-space-between-bracketsinvalid-characterinvalid-tabkeyword-has-whitespacekeywords-missing-spacemisleading-inline-if-continuationmisleading-inline-if-semicolonmissing-end-labelmissing-newline-at-end-of-filemixed-scalar-array-declarationmultiple-allocations-with-statnonportable-shortcircuit-inquiryold-mpi-moduleout-of-line-attributepointer-initialisation-in-declarationpointer-initialisation-in-declarationsplit-escaped-quotestat-without-messagesuperfluous-else-cyclesuperfluous-else-exitsuperfluous-else-returnsuperfluous-else-stopunchecked-statunreachable-statementuseless-return
Bug fixes
- Fix
line-too-longfor lines exactly on limit (#631) - Fix false positive with inline
if(...) returninsuperfluous-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
Rules
- Add rule
missing-newline-at-end-of-file(#552) - Add rule
unreachable-statement(#563) - Add rules
useless-returnandsuperfluous-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
--previewmode: missing-default-casemagic-number-in-array-sizemagic-io-unitmissing-action-specifiertrailing-backslashmissing-default-pointer-initialisationmissing-intrinsicinclude-statementnon-portable-io-unitsuperfluous-semicolonmultiple-statements-per-linemultiple-modulesprogram-with-modulespecific-namecomputed-go-to- Fix
incorrect-space-before-commentspan to point at whitespace (#581) - Fix
missing-intentforexternaldummy arguments (#580)
CLI / Configuration
- Add more capabilities to
fortitude explain(#542) - Add
fortitude configcommand (#540) - Add
--isolatedoption, and user-specific config files (#535) - Add
--target-stdoption (#551) - Add top-level
includeoption; deprecatefiles/file_extensions(#534)
Bug fixes
- Always report fixes, even if no violations left (#541)
- Fix
versioncommand for changedcrates/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.tomlconfig file (#532) - Add
Optionsmanagement flowchart to docs (#550) - Add note about
assumed-size-character-intentwith 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
- @loicreynier
- @ZedThree
- @fbjones-lanl
- @LawrenceDior
- @casperdcl
- @imciner2
- @LiamPattinson
- @foxtran
- @jatkinson1000
0.8.0rc1
Released on 2025-12-19.
Enhancements
Rules
- Add rule
missing-newline-at-end-of-file(#552) - Add rule
unreachable-statement(#563) - Add rules
useless-returnandsuperfluous-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
--previewmode: missing-default-casemagic-number-in-array-sizemagic-io-unitmissing-action-specifiertrailing-backslashmissing-default-pointer-initialisationmissing-intrinsicinclude-statementnon-portable-io-unitsuperfluous-semicolonmultiple-statements-per-linemultiple-modulesprogram-with-modulespecific-namecomputed-go-to
CLI / Configuration
- Add more capabilities to
fortitude explain(#542) - Add
fortitude configcommand (#540) - Add
--isolatedoption, and user-specific config files (#535) - Add
--target-stdoption (#551) - Add top-level
includeoption; deprecatefiles/file_extensions(#534)
Bug fixes
- Always report fixes, even if no violations left (#541)
- Fix
versioncommand for changedcrates/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.tomlconfig file (#532) - Add
Optionsmanagement flowchart to docs (#550)
Miscellaneous
- Reduce minimal Python version to 3.7 (#538)
Contributors
0.7.5
Bug fixes
- Fix
fmtargument 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-stringtobad-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-unittriggering 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-fortranversion (#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
valuedummy args inmissing-intent(#421)
Bug fixes
- Don't raise
SyntaxErrorfor missing nodes if rule not enabled (#430)
Documentation
- Clarify
line-too-longbehaviour 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.tomlexamples indocs/settings.md(#387)
Other changes
- Raise
SyntaxErrorfor 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/cyclein unlabelled loop (#364) - Expand rule for
character*(*)to handlecharacter*N,character*(:), andcharacter*(expression)(#354)
Bug fixes
- Don't print diagnostics in
--fix-onlymode (#359) - Fix
--statisticsreporting for unsafe fixes (#368) - Fix false positive
real-implicit-kindintypedeclaration (#378) - Move
default-public-accessibilityhighlight topublicstatement (#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:
missing-accessibility-statement(C131)default-public-accessibility(C132)implicit-external-procedures(C003)
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-specifierandIorule category (#230) - Add rule for deleted feature
pausestatements (#304) - Add rule to find computed go to statements (#264)
- Add rule to find missing intrinsic specifiers in
usestatements (#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
includestatements (#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_envparameters for literal kinds (#245)
CLI
- Add
--exit-zeroand--exit-non-zero-on-fixCLI options (#328) - Add
--statisticsCLI 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/silentflags (#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
DefaultorOptionalinmap_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-lengthandfile-extensionsignored in toml files (#251) - Bugfix: fix
get_filesforce excluding with directories (#296) - Bugfix: make
specific-namesan 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_replacementeating newlines (#225)
0.6.1
Bug fixes
- Bugfix:
star-kindfix 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
externalprocedures (#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
privatestatements in modules (#150) - Add rule for missing double-colon in variable decls (#171)
- Add rule for obsolescent
entrystatement (#169) - Add rule for statement functions (#162)
- Rename
external-functiontoprocedure-not-in-module(#200)
CLI
- Add
--previewoption (#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:
DiagnosticMessageswere 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
procedurearguments (#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
explainarguments 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
Other changes
- Enable more sophisticated rule selection (#108)
0.4.0
Configuration
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
intentattribute (#50) - Add rule for missing label on
exit/cycle(#53) - Add rule for non-explicit end statements (#84)
- Add rules for
characterassumed size issues (#75) - Implicit real kinds rule (#81)
- Print context of violations (#45)
Bug fixes
- Bugfix: newline printed for files without rule violations (#42)