I think we have a bug in clang that should be fixed before 2.7.
According to C99 6.2.1p4 the scope of tag declarations, when embedded in
a declarator inside a function parameter list, should be the function
block (this is not true for C++: see 3.3.1p5).
This means that:
void f(struct s *x) {
struct s { int f; } *y = x;
}
should be legal according to C99 but not legal according to C++.
Clang currently believes that this code is not legal for both.
The bug has already been inserted in bugzilla: