Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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

@tstreiff

Description

@tstreiff
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

Metadata

Metadata

Assignees

No one assigned

    Labels

    C frontendIssues related to the C language compiler

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions