Skip to content

Compilation warning when comparing enum literal and enum variable #166

@Roysten

Description

@Roysten

Reproducer:

#include "utest.h"

enum My_enum {
	MY_ENUM_A,
	MY_ENUM_B,
	MY_ENUM_C,
};

UTEST(Utest, sign_compare)
{
	enum My_enum e = MY_ENUM_A;
	ASSERT_EQ(MY_ENUM_A, e);
}

UTEST_MAIN()

Compilation:

gcc -std=gnu11 -Wall -Wextra -pedantic src-test/main.c

In file included from src-test/main.c:1:
src-test/main.c: In function ‘utest_run_Utest_sign_compare’:
src-test/utest.h:828:42: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
  828 | #define ASSERT_EQ(x, y) UTEST_COND(x, y, ==, "", 1)
      |                                          ^~
src-test/utest.h:783:18: note: in definition of macro ‘UTEST_COND’
  783 |     if (!((xEval)cond(yEval))) {                                               \
      |                  ^~~~
src-test/main.c:17:9: note: in expansion of macro ‘ASSERT_EQ’
   17 |         ASSERT_EQ(MY_ENUM_A, e);
      |         ^~~~~~~~~

This was surprising to me. Note that an explicit cast of the variable e to int compiles without warning. GCC version 12.2.0.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions