Skip to content

Evaluation of VM-typed expression operand to typeof #122

@fuhsnn

Description

@fuhsnn

With the test:

#include <stdio.h>

#define TEST(_arrsz, ...)                                                      \
  do {                                                                         \
    int (*p)[_arrsz];                                                          \
    p = (void *)0;                                                             \
    do {                                                                       \
      __VA_ARGS__                                                              \
    } while (0);                                                               \
    printf("ptr: int(*p)[%s], statmemt: { %s }, operand evaluated : %d\n",     \
           #_arrsz, #__VA_ARGS__, (p != (void *)0));                           \
  } while (0)

#define TEST2(...)                                                             \
  TEST(3, __VA_ARGS__);                                                        \
  TEST(i, __VA_ARGS__)

void fn(int i) {
  TEST2(__typeof__(*p++) var;);
  //  TEST2(typeof(*p++) var;);
  TEST2(sizeof(*p++););
  TEST2(_Alignof(*p++););
  //  TEST2( _Countof(*p++);   );
}

int main(void) { fn(3); }

GCC/Clang

ptr: int(*p)[3], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { __typeof__(*p++) var; }, operand evaluated : 1
ptr: int(*p)[3], statmemt: { sizeof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { sizeof(*p++); }, operand evaluated : 1
ptr: int(*p)[3], statmemt: { _Alignof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { _Alignof(*p++); }, operand evaluated : 0
ptr: int(*p)[3], statmemt: { _Countof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { _Countof(*p++); }, operand evaluated : 1

icc:

ptr: int(*p)[3], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[3], statmemt: { sizeof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { sizeof(*p++); }, operand evaluated : 1
ptr: int(*p)[3], statmemt: { _Alignof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { _Alignof(*p++); }, operand evaluated : 0

Pelles C

ptr: int(*p)[3], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[3], statmemt: { sizeof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { sizeof(*p++); }, operand evaluated : 0

DigitalMars C

ptr: int(*p)[3], statmemt: { sizeof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { sizeof(*p++); }, operand evaluated : 0

TinyCC,cproc,kefir,chibicc,xcc:

ptr: int(*p)[3], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { __typeof__(*p++) var; }, operand evaluated : 0
ptr: int(*p)[3], statmemt: { sizeof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { sizeof(*p++); }, operand evaluated : 0
ptr: int(*p)[3], statmemt: { _Alignof(*p++); }, operand evaluated : 0
ptr: int(*p)[i], statmemt: { _Alignof(*p++); }, operand evaluated : 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