Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Declaration of method changes meaning of symbol

Tags:

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.

like image 773
HighCommander4 Avatar asked Mar 20 '13 23:03

HighCommander4


1 Answers

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.

like image 107
Jesse Good Avatar answered Oct 13 '22 20:10

Jesse Good