Interestingly, the clang does not complain with this code, even with -pedantic-errors flag. 
This is most certainly about C11 §6.7.9/p4 Initialization (emphasis mine going forward)
All the expressions in an initializer for an object that has static or
  thread storage duration shall be constant expressions or string
  literals.
Another subclause to look into is §6.5.2.5/p5 Compound literals:
The value of the compound literal is that of an unnamed object
  initialized by the initializer list. If the compound literal occurs
  outside the body of a function, the object has static storage
  duration; otherwise, it has automatic storage duration associated with
  the enclosing block.
and (for completeness) §6.5.2.5/p4:
In either case, the result is an lvalue.
but this does not mean, that such unnamed object can be treated as constant expression. The §6.6 Constant expressions says inter alia:
2) A constant expression can be evaluated during translation rather
  than runtime, and accordingly may be used in any place that a constant
  may be.
3) Constant expressions shall not contain assignment, increment,
  decrement, function-call, or comma operators, except when they are
  contained within a subexpression that is not evaluated.
10) An implementation may accept other forms of constant expressions.
There is no explicit mention about compound literals though, thus I would interpret this, they are invalid as constant expressions in strictly conforming program (thus I'd say, that clang has a bug).
Section J.2 Undefined behavior (informative) also clarifies that:
A constant expression in an initializer is not, or does not evaluate
  to, one of the following: an arithmetic constant expression, a null
  pointer constant, an address constant, or an address constant for a
  complete object type plus or minus an integer constant expression
  (6.6).
Again, no mention about compound literals.
Neverthless, there is a light in the tunnel. Another way, that is fully sanitized is to convey such unnamed object as address constant. The standard states in §6.6/p9 that:
An address constant is a null pointer, a pointer to an lvalue
  designating an object of static storage duration, or a pointer to a
  function designator; it shall be created explicitly using the unary &
  operator or an integer constant cast to pointer type, or implicitly by
  the use of an expression of array or function type. The
  array-subscript [] and member-access . and -> operators, the address &
  and indirection * unary operators, and pointer casts may be used in
  the creation of an address constant, but the value of an object shall
  not be accessed by use of these operators.
hence you can safely initialize it with constant expression in this form, because such compound literal indeed designates an lvalue of object, that has static storage duration:
#include <stdio.h>
struct Test
{
    int a;
};
static struct Test *tt = &((struct Test) {1}); /* 2 */
int main(void)
{
    printf("%d\n", tt->a);
    return 0;
}
As checked it compiles fine with -std=c99 -pedantic-errors flags on both gcc 5.2.0 and clang 3.6.
Note, that as opposite to C++, in C the const qualifier has no effect on constant expressions.