#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#define T(expr) do { \
int cond = (expr); \
printf("%s -> %s\n", #expr, cond ? "true" : "false"); \
assert(cond); \
}while(0)
int main() {
size_t x = 0;
T(sizeof(int[x]) == 0);
T(x == 0);
T(sizeof(int[++x]) == sizeof(int[1]));
T(x == 1);
char a[x], b[x];
T(sizeof(++x ? a : b) == sizeof(char*)); // arrays are converted to pointers
T(x == 1);
const size_t n = 10;
char c[n];
T(sizeof(++x ? a : c) == sizeof(char*));
T(x == 1);
T(sizeof(++x ? c : a) == sizeof(char*));
T(x == 1);
T(sizeof(a) == sizeof(char[1]));
T(sizeof(c) == sizeof(char[n]));
T(sizeof(c) == n*sizeof(char));
// T(++x ? int[x] : int[n]); // compilation error
return (x == 1) ? EXIT_SUCCESS : EXIT_FAILURE;
}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBUKGV4cHIpIGRvIHsJCQkJCVwKICBpbnQgY29uZCA9IChleHByKTsJCQkJCVwKICBwcmludGYoIiVzIC0+ICVzXG4iLCAjZXhwciwgY29uZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwlcCiAgYXNzZXJ0KGNvbmQpOwkJCQkJCVwKICB9d2hpbGUoMCkKCmludCBtYWluKCkgewogIHNpemVfdCB4ID0gMDsKICBUKHNpemVvZihpbnRbeF0pID09IDApOwogIFQoeCA9PSAwKTsKCiAgVChzaXplb2YoaW50WysreF0pID09IHNpemVvZihpbnRbMV0pKTsKICBUKHggPT0gMSk7CgogIGNoYXIgYVt4XSwgYlt4XTsKICBUKHNpemVvZigrK3ggPyBhIDogYikgPT0gc2l6ZW9mKGNoYXIqKSk7IC8vIGFycmF5cyBhcmUgY29udmVydGVkIHRvIHBvaW50ZXJzCiAgVCh4ID09IDEpOwoKICBjb25zdCBzaXplX3QgbiA9IDEwOwogIGNoYXIgY1tuXTsKICBUKHNpemVvZigrK3ggPyBhIDogYykgPT0gc2l6ZW9mKGNoYXIqKSk7CiAgVCh4ID09IDEpOwoKICBUKHNpemVvZigrK3ggPyBjIDogYSkgPT0gc2l6ZW9mKGNoYXIqKSk7IAogIFQoeCA9PSAxKTsKCiAgVChzaXplb2YoYSkgPT0gc2l6ZW9mKGNoYXJbMV0pKTsKICBUKHNpemVvZihjKSA9PSBzaXplb2YoY2hhcltuXSkpOwogIFQoc2l6ZW9mKGMpID09IG4qc2l6ZW9mKGNoYXIpKTsKICAKICAvLyBUKCsreCA/IGludFt4XSA6IGludFtuXSk7IC8vIGNvbXBpbGF0aW9uIGVycm9yCiAgcmV0dXJuICh4ID09IDEpID8gRVhJVF9TVUNDRVNTIDogRVhJVF9GQUlMVVJFOwp9Cg==