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

Enea Zaffanella zaffanella at cs.unipr.it
Fri Jul 13 00:17:48 PDT 2012


Ping.

On 07/09/2012 10:57 AM, Enea Zaffanella wrote:
> 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.
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>





More information about the cfe-dev mailing list