Skip to content

Unwarranted "equality without matching types" error #933

Open
@cliffordwolf

Description

@cliffordwolf

The following example code causes CBMC to fail with an equality without matching types error:

#include <assert.h>
#include <stdint.h>
#include <stdbool.h>

#undef HOTFIX

typedef struct {
  uint32_t value_31_0 : 32;
} signal32_t;

typedef struct {
  uint8_t value_0_0 : 1;
} signal1_t;

static inline bool yosys_simplec_get_bit_25_of_32(const signal32_t *sig)
{
  return (sig->value_31_0 >> 25) & 1;
}

struct rvfi_insn_srai_state_t
{
  signal32_t rvfi_insn;
  signal32_t rvfi_rs1_rdata;
  signal1_t _abc_1398_n364;
  signal1_t _abc_1398_n363;
};

void test(rvfi_insn_srai_state_t state, bool valid)
{
#ifndef HOTFIX
  state._abc_1398_n364.value_0_0 = yosys_simplec_get_bit_25_of_32(&state.rvfi_insn) ?
      yosys_simplec_get_bit_25_of_32(&state.rvfi_rs1_rdata) : state._abc_1398_n363.value_0_0;
#else
  state._abc_1398_n364.value_0_0 = yosys_simplec_get_bit_25_of_32(&state.rvfi_insn) ?
      yosys_simplec_get_bit_25_of_32(&state.rvfi_rs1_rdata) : (bool)state._abc_1398_n363.value_0_0;
#endif

  assert(valid);
}

I'm running this with cbmc --function test test.cc using todays git head.

Defining HOTFIX (and thus explicitly casting state._abc_1398_n363.value_0_0 from uint8_t : 1 to bool in the third argument to the ternary operator) works around the issue. GCC 5.4 and Clang 3.8 both accept the above code without warnings.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions