range-based for の declaration と expression の可視性について

先週、ようやく range-based for が gcc-4.6 に実装されました。めでたい。

さて range-based for ですが、規格によると

for ( for-range-declaration : expression ) statement

{
  auto && __range = ( expression );
  for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
    for-range-declaration = *__begin;
    statement
  }
}

は "equivalent" であるとされています。この "equivalent" が曲者で、どのレベルでの話なのかが分からないのです。

現在の gcc-4.6 の実装は range-baased for がきたら、そのまま構文木のレベルで後者の物に置き換えています。-fdump-tree-original とかするとなんとなく雰囲気が掴めると思います。
ここで一つ問題が発生して、range-baseed for と置換後の for では、declaration と expression の位置関係が逆になっています。そのため、一見問題なさそうな下のようなコードは、コンパイルすることができません。

int main(){
  for (int i : (decltype(i)[1]){ 0 });
}

うーん…どうなんだろう。

あと逆のパターンで、一見通りそうにないけれど…みたいなのもありそうなんですが、考えてないです。誰か思いついたら教えてください。

追記:declaration は expression に依存しているので、仕方ない気がしてきた。