windelbouwman / ppci

A compiler for ARM, X86, MSP430, xtensa and more implemented in pure Python
https://ppci.readthedocs.io/en/latest/
BSD 2-Clause "Simplified" License
337 stars 36 forks source link

ppci-cc: conditional operator does not work with struct/union types #104

Open tstreiff opened 4 years ago

tstreiff commented 4 years ago
typedef struct { int x, y; } point_t;

point_t origin = { 0, 0 };

point_t f1(point_t *p) {
  if (p) return *p;
  else return origin;
}

Compilation and execution are OK.

Same function, written differently:

point_t f2(point_t *p) {
  return p ? *p : origin;
}

It fails to compile:

14:  return pp ? *pp : origin;
               ^ Cannot determine type rank for 'Structured-type field_names=['x', 'y']'

The C standard lists all possible combinations for the 2nd and 3rd operands types:

  1. if one is struct/union type, the other shall be the same (our case)
  2. it one is void, the other shall be void
  3. if one is a pointer to a type T, the other may be of the same pointer type, or void * or 0/NULL
  4. if one is an arithmetic type, the other shall be an arithmetic type, and the usual arithmetic conversions apply (integer promotion, etc.) to find the common type