http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48948
--- Comment #3 from Johannes Schaub <schaub.johannes at googlemail dot com> 2011-05-10 16:46:18 UTC --- (In reply to comment #2) > (In reply to comment #1) > > I don't think that this is intended, but I would like to await feedback from > the developer group before submitting a corresponding core issue. IMO there > are > some core wordings in regard to type completeness that are not intended to be > read strictly, e.g. 3.2 p.4 > > "— a function with a return type or argument type of type T is defined (3.1) > [..]" > > can be read to disallow any of the following function definitions: > > struct A { > A f(A a) { return a; } > friend A g(A a) { return a; } > }; > > I haven't seen a compiler who rejects this code, because they all contribute > more weight to 9.2 p.2. Within "A a" (the parameters) and within "A f" / "A g" (the return types), the class A is incomplete. Only within the function bodies, the class A is complete by 9.2p2. The compilers accept that code because of 8.3.5p9. 3.2 p4 is a non-normative big note, which can impossibly achieve the precision of covering every detail. It only provides a rough description.