Coding Convention Messages

c001

⚠️ Found ${statement} with unchecked STAT in “${proc}”

✅ Please always check the content of the variable passed to STAT= in the very next statement.


c002

⚠️ Module “${mod}” USEd without ONLY clause or not PRIVATE

✅ Please start every Fortran module with PRIVATE to prevent accidental leakage of symbols.

This message can also appear when a module is used without an ONLY clause. However, in that case the compiler warning -Wuse-without-only will also be triggered.


c003

⚠️ Symbol “${var}” in procedure “${proc}” is IMPLICIT-SAVE

✅ Please either move the variable initialization to the routine body or add an explicit SAVE attribute.

In Fortran, assigning a variable at declaration implicitly adds the SAVE attribute. As an unexpected consequence the variable gets persevered across subroutine invocations. In the C programming language these are called static variables.


c004

⚠️ Symbol “${var}” in procedure “${proc}” is IMPLICIT-TYPE

✅ Please start every Fortran module with IMPLICIT NONE to disable implicit typing.


c005

⚠️ Symbol “${var}” in procedure “${proc}” is THREADPRIVATE

✅ Please don't use thread-private variables because they break easily.

The OpenMP standard guaranteed the persistence of thread-private variables only between consecutive parallel regions and only under very specific conditions. Since any subroutine can open a parallel regions (or might in the future) this construct is very brittle.

As a workaround simply allocate an array of size omp_get_max_threads().


c006

⚠️ OMP PARALLEL without DEFAULT(NONE) found in “${proc}”

✅ Please always include DEFAULT(NONE) when opening an OpenMP parallel region to avoid sharing a variable accidentally.


c007

⚠️ Found CALL with NULL() as argument in procedure “${proc}”


c008

⚠️ Found ASSOCIATE statement inside OMP PARALLEL region in procedure “${proc}”

✅ Please don't use ASSOCIATE inside an OpenMP parallel region because some compilers get it wrong.

See #2668 for details.


c012

⚠️ Found WRITE statement with hardcoded unit in “${proc}”

✅ Please don't writing to stdout directly, but instead use a printkey.

Printkeys allow the user to control the verbosity of the output.


c013

⚠️ Found DEALLOCATE with STAT argument in “${proc}”

✅ Please don't STAT= to DEALLOCATE to ensure that the program stops after a failure.

A failed deallocation is always indicative of a bug (e.g. double free or segmentation fault) and the program should not continue afterwards.


c014

⚠️ Found FLOAT in “${proc}”


c015

⚠️ Found lossy conversion ${m.group(1)} without KIND argument in “${proc}”


c016

⚠️ Found type ${derived_type} without initializer

✅ Please add default initialization to every derived type, for example like this:

TYPE foo_type
   ! Primitive types.
   INTEGER                             :: my_int     = -1
   REAL(dp)                            :: my_real    = 0.0_dp
   LOGICAL                             :: my_logical = .FALSE.
   CHARACTER(LEN=42)                   :: my_string  = ""
   REAL(dp), DIMENSION(3)              :: my_array   = [1.0_dp, 2.0_dp, 3.0_dp]
 
   ! Arrays can also be initialized via broadcasting of a scalar.
   REAL(dp), DIMENSION(3)              :: my_array2   = 0.0_dp
 
   ! Pointers should be nullified.
   REAL(dp), DIMENSION(:), POINTER     :: my_pointer1 => NULL()
   TYPE(bar_type), POINTER             :: my_pointer2 => NULL()
 
   ! Derived types can be initialized through their constructor.
   TYPE(bar_type)                      :: my_derived  = bar_type()
 
   ! Allocatables get automatically nullified.
   REAL(dp), DIMENSION(:), ALLOCATABLE :: my_alloc
 
   ! Allocatables of derived types get auto initialized upon allocation.
   TYPE(bar_type), ALLOCATABLE         :: my_derived_alloc
END TYPE foo_type

c101

⚠️ Found CALL cp_fm_gemm in procedure “${proc}”

✅ Please don't call cp_fm_gemm directly, but instead use parallel_gemm from src/parallel_gemm_api.F. It allows for switching between different implementation - in particular ScaLAPACK and COSMA.


c102

⚠️ Found CALL m_abort in procedure “${proc}”

✅ Please don't call m_abort directly, but instead use the error handling macro CPABORT(“message”).


c103

⚠️ Found CALL mp_abort in procedure “${proc}”

✅ Please don't call mp_abort directly, but instead use the error handling macro CPABORT(“message”).


c104

⚠️ Found CALL RANDOM_NUMBER in procedure “${proc}”

✅ Please don't call RANDOM_NUMBER, but instead use src/common/parallel_rng_types.F.


c105

⚠️ Found CALL RANDOM_SEED in procedure “${proc}”

✅ Please don't call RANDOM_SEED, but instead use src/common/parallel_rng_types.F.


c106

⚠️ Found CALL EXECUTE_COMMAND_LINE in procedure “${proc}”

✅ Please don't call EXECUTE_COMMAND_LINE, but instead use a workflow engine like AiiDA.


c201

⚠️ Found GOTO statement in procedure “${proc}”

✅ Please don't use the GOTO statement because it's harmful and dangerous.


c202

⚠️ Found FORALL statement in procedure “${proc}”

✅ Please don't use the FORALL statement because it's deprecated since Fortran 2018.


c203

⚠️ Found OPEN statement in procedure “${proc}”

✅ Please don't call OPEN directly, but instead use the wrappers from src/common/cp_files.F.


c204

⚠️ Found CLOSE statement in procedure “${proc}”

✅ Please don't call CLOSE directly, but instead use the wrappers from src/common/cp_files.F.


c205

⚠️ Found STOP statement in procedure “${proc}”

✅ Please don't call STOP directly, but instead use the error handling macro CPABORT(“message”).