int x(void) {
  char ptr[1] = { 'A' };
  typedef int I;
  {
    int I = 2;
    int ptr = 3;
    // Syntax is ambiguous unless we know whether I is a variable or a derived type name.
    // If we attempt to parse C 'program-at-a-time' instead of 'statement-at-a-time' then
    // we cannot (easily) know if I is a variable or a typename at parse time.
    int J = (I) * ptr;  //  Here it is a variable.
  }
    int J = (I) *ptr;  //  Here it is a typedef.
}
