https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89450

            Bug ID: 89450
           Summary: RFC: Strengthen -fstrict-enums
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marxin at gcc dot gnu.org
  Target Milestone: ---

Currently, we warn about:

$ cat /tmp/strict.cc
enum XXX
{
  A,
  B,
  C,
  D,
  E
};

int foo(XXX x)
{
  switch (x)
  case A:
  case B:
  case C:
  case D:
  case E:
    return 2;
}

int main(int argc, char **argv)
{
  return foo ((XXX)argc);
}

$ g++ /tmp/strict.cc  -c  -fstrict-enums
/tmp/strict.cc: In function ‘int foo(XXX)’:
/tmp/strict.cc:19:1: warning: control reaches end of non-void function
[-Wreturn-type]
   19 | }
      | ^

Issues is that:

 14746        /* If -fstrict-enums, still constrain TYPE_MIN/MAX_VALUE.  */
 14747        if (flag_strict_enums)
 14748          set_min_and_max_values_for_integral_type (enumtype, precision,
sgn);

is called for precision, which sets min = 0 and max = 7.

What about doing:

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 612afbacd27..46302b4a61d 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -14745,7 +14745,10 @@ finish_enum_value_list (tree enumtype)

       /* If -fstrict-enums, still constrain TYPE_MIN/MAX_VALUE.  */
       if (flag_strict_enums)
-       set_min_and_max_values_for_integral_type (enumtype, precision, sgn);
+       {
+         TYPE_MIN_VALUE (enumtype) = minnode;
+         TYPE_MAX_VALUE (enumtype) = maxnode;
+       }
     }
   else
     underlying_type = ENUM_UNDERLYING_TYPE (enumtype);

I can also imagine another option level when desired.

Reply via email to