-
Notifications
You must be signed in to change notification settings - Fork 41
Open
Labels
C frontendIssues related to the C language compilerIssues related to the C language compiler
Description
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:
- if one is struct/union type, the other shall be the same (our case)
- it one is void, the other shall be void
- if one is a pointer to a type T, the other may be of the same pointer type, or void * or 0/NULL
- 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
Labels
C frontendIssues related to the C language compilerIssues related to the C language compiler