For the following code:
struct foo {};
struct A
{
typedef foo foo_type;
void foo();
};
GCC gives a compiler error:
test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive]
void foo();
^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive]
struct foo {};
^
But clang accepts it without compiler errors. Who is right?
Note that if the typedef is removed, or changed to typedef ::foo foo_type, both gcc and clang accept the code.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With