title: Have anonymous structs and unions in C11 been incorrectly described?
body: <p>Sayeth the C standard, regarding anonymous structs and unions:</p>
  
  <blockquote>
    <p><a href="http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p13" rel="nofollow noreferrer">6.7.2.1 p13.</a>  An unnamed member whose type specifier is a structure specifier with
    no tag is called an anonymous structure; an unnamed member whose type
    specifier is a union specifier with no tag is called an anonymous
    union. <strong>The members of an anonymous structure or union are considered
    to be members of the containing structure or union.</strong> This applies
    recursively if the containing structure or union is also anonymous.</p>
  </blockquote>
  
  <p>Note emphasis: rather than the members of the anonymous struct/union being in the <em>scope</em> of the containing struct/union, they are fully <em>members</em> of it. But there are responsibilities attached to that:</p>
  
  <blockquote>
    <p><a href="http://port70.net/~nsz/c/c11/n1570.html#6.7.2.1p16" rel="nofollow noreferrer">6.7.2.1 p16.</a> The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at any time. A pointer to a union object, suitably converted, points to <strong>each of its members</strong> (or if a member is a bit-field, then to the unit in which it resides), and vice versa.</p>
  </blockquote>
  
  <p>Taken together, those seem to imply that the members of an anonymous struct within a (named) union behave like co-located, mutually-exclusive members of the union. So the following should work:</p>
  
  <pre><code>union Foo
  {
      struct
      {
          char a;
          char b;
      };
  };
  
  int main(void) {
      union Foo f;
      assert(&amp;f == &amp;(f.a) &amp;&amp; &amp;f == &amp;(f.b));
  }
  </code></pre>
  
  <p>Of course, it doesn't, and we wouldn't want it to... there'd be no reason for anonymous structs/unions if they worked like the above. Still, the Standard seems unambiguous on that point. Is there something I'm missing?</p>