gcc is correct, but clang is not required to give a diagnostic (3.3.7):
A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.
This is because of how class scope works. The foo
of void foo();
is visible within the entire scope of the class A
, so the declaration of void foo();
changes the meaning of foo
in the typedef from referring to struct foo
to the name of the function foo
.