[cfe-dev] The DeclContext of block-scope function declarations.

Enea Zaffanella zaffanella at cs.unipr.it
Mon Jul 9 01:57:08 PDT 2012


Consider the following program:

$ cat block.cc
namespace N {

void f() {
   extern int var;     // #1
   extern void g(int); // #2
   g(var);
}

class S {
   friend void h();    // #3
};

} // namespace N


Function N::f() declares extern function `g(int)' and int object `var'.
In the AST generated by clang, these two block-scope declarations have 
function N::f() as their (semantic and lexical) DeclContext.

However, C++11 3.5p7 says:

   "When a block scope declaration of an entity with linkage is not
    found to refer to some other declaration, then that entity is a
    member of the innermost enclosing namespace. However such a
    declaration does not introduce the member name in its
    namespace scope."

This seems to suggest that both `g(int)' and `var' should have namespace 
N as their semantic DeclContext (but be "hidden" there), while still 
having f() as their lexical DeclContext. That is, things should be (more 
or less) similar to the case of friend function h() in class S.

As an example where this DeclContext issue matters, when calling method

    NamedDecl::getQualifiedNameAsString()

on the three declarations we obtain:

    #1  var     // wrong, should be N::var
    #2  g       // wrong, should be N::g
    #3  N::h    // correct

We would appreciate if someone could confirm the issue and diagnosis 
above, as well as hinting at the places in Sema that need to be modified 
to obtain the correct behavior.

Cheers,
Enea.



More information about the cfe-dev mailing list