This is the Designated Initializer syntax of C structs. The parentheses () are used to cast the struct to a CGRect. As Martin R points out, the cast is not necessary unless you use compound literal syntax, where you don’t name the parameters.

Short answer: Clang confesses that the program uses an extension Accepting what you wrote, int p[] = (int []) {1, 2};, is a Clang extension. GCC is allowed to reject it, because it is not part of C99 (the C99 standard introduced compound literals and can be used as reference)....

Perhaps calling the object a "compound literal" is a bit misleading. It is actually not really so literal. It's helpful to consider an actual example, even if it's a bit dumb: /* This is NOT the way to solve this problem */ double cubic(double x, double a, double b, double...

By definition a compound literal does not consist of & address-of operator. From N1570 6.5.2.5/p3 Compound literals: A postfix expression that consists of a parenthesized type name followed by a brace-enclosed list of initializers is a compound literal. Now, their statement: Compound literals for scalar types and union types are...