Home > other >  "control reaches end of non-void function" produces error instead of warning
"control reaches end of non-void function" produces error instead of warning

Time:03-13

I'm trying to compile a large project (https://github.com/ESCOMP/CTSM). I would like to compile it as-is, without editing the code, if possible (it is known to build successfully on many platforms).

I'm using gcc (SUSE Linux) 11.2.1. and I get

In function ncmp : /run/media/dominic/hdbtrfs/dominic/git/ESCOMP/CTSM/cime/src/share/timing/gptl.c:4069:1: error: control reaches end of non-void function [-Werror=return-type]

from the following function. I believe that earlier versions of gcc only gives a warning rather than an error in this instance.

/*
** ncmp: compares values of memory adresses pointed to by a pointer. for use with qsort
*/

static int ncmp( const void *pa, const void *pb )
{
  static const char *thisfunc = "GPTLsetoption";
  const char** x = (const char**)pa;
  const char** y = (const char**)pb;

  if( *x > *y )
    return 1;
  if( *x < *y )
    return -1;
  if( *x == *y )
    GPTLerror("%s: shared memory address between timers\n", thisfunc);
}

I expect this can be fixed by inserting a spurious return statement at the end of the function, but since I am interested to try to build an unmodified version of the code (I'm not currently a contributor on the project, so can't push changes upstream) I'm wondering if there's a workaround to convert this error to a warning using compiler flags?

As requested here is the gcc call that is genertaed by the makefile:

mpicc -c -I/run/media/dominic/hdbtrfs/dominic/git/ESCOMP
/CTSM/cime/src/share/timing  -std=gnu99 -O    -DCESMCOUPLED 
-DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU  -DCESMCOUPLED  
-DFORTRANUNDERSCORE -DNO_R16 -DCPRGNU  -DNUOPC_INTERFACE 
-DHAVE_MPI /run/media/dominic/hdbtrfs/dominic/git/ESCOMP
/CTSM/cime/src/share/timing/gptl.c

CodePudding user response:

I'm wondering if there's a workaround to convert this error to a warning using compiler flags?

I would expect the -Wno-error option to have that effect. It should also be possible to narrow the scope of that to the specific diagnostic you report, but beware: there is no way with command-line options alone to narrow the effect to this particular instance of the issue.

Addendum

The question having been edited to show that the diagnostic category is return-type, I can say that one would use -Wno-error=return-type to make all diagnostics of this type warnings instead of errors.

CodePudding user response:

-Werror elevates all warnings to errors. You can turn reverse this for specific warnings with -Wno-error=WarningName, such as -Wno-error=return-type, as is clearly documented in the GCC documentation for warning options:

This switch [-Werror=] takes a negative form, to be used to negate -Werror for specific warnings; for example -Wno-error=switch makes -Wswitch warnings not be errors, even when -Werror is in effect.

  •  Tags:  
  • c gcc
  • Related