[cfe-commits] r73652 - in /cfe/trunk: include/clang/Parse/Action.h lib/Parse/ParseDecl.cpp lib/Sema/Sema.h lib/Sema/SemaDeclCXX.cpp test/CXX/basic/basic.lookup/basic.lookup.unqual/p13.cpp

Douglas Gregor dgregor at apple.com
Wed Jun 17 16:00:50 PDT 2009


On Jun 17, 2009, at 3:50 PM, Argiris Kirtzidis wrote:

> Author: akirtzidis
> Date: Wed Jun 17 17:50:06 2009
> New Revision: 73652
>
> URL: http://llvm.org/viewvc/llvm-project?rev=73652&view=rev
> Log:
> Implement correct name lookup inside an initializer of a C++ class  
> static data member.
>
> Fixes "test/CXX/basic/basic.lookup/basic.lookup.unqual/p13.cpp" test  
> case.

Looks good, thanks!

> Modified:
>    cfe/trunk/include/clang/Parse/Action.h
>    cfe/trunk/lib/Parse/ParseDecl.cpp
>    cfe/trunk/lib/Sema/Sema.h
>    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>    cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p13.cpp
>
> Modified: cfe/trunk/include/clang/Parse/Action.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=73652&r1=73651&r2=73652&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Parse/Action.h (original)
> +++ cfe/trunk/include/clang/Parse/Action.h Wed Jun 17 17:50:06 2009
> @@ -248,6 +248,19 @@
>   virtual void ActOnCXXExitDeclaratorScope(Scope *S, const  
> CXXScopeSpec &SS) {
>   }
>
> +  /// ActOnCXXEnterDeclInitializer - Invoked when we are about to  
> parse an
> +  /// initializer for the declaration 'Dcl'.
> +  /// After this method is called, according to [C++ 3.4.1p13], if  
> 'Dcl' is a
> +  /// static data member of class X, names should be looked up in  
> the scope of
> +  /// class X.
> +  virtual void ActOnCXXEnterDeclInitializer(Scope *S, DeclPtrTy  
> Dcl) {
> +  }
> +
> +  /// ActOnCXXExitDeclInitializer - Invoked after we are finished  
> parsing an
> +  /// initializer for the declaration 'Dcl'.
> +  virtual void ActOnCXXExitDeclInitializer(Scope *S, DeclPtrTy Dcl) {
> +  }
> +
>   /// ActOnDeclarator - This callback is invoked when a declarator  
> is parsed and
>   /// 'Init' specifies the initializer if any.  This is for things  
> like:
>   /// "int X = 4" or "typedef int foo".
>
> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=73652&r1=73651&r2=73652&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed Jun 17 17:50:06 2009
> @@ -402,7 +402,14 @@
>       SourceLocation DelLoc = ConsumeToken();
>       Actions.SetDeclDeleted(ThisDecl, DelLoc);
>     } else {
> +      if (getLang().CPlusPlus)
> +        Actions.ActOnCXXEnterDeclInitializer(CurScope, ThisDecl);
> +
>       OwningExprResult Init(ParseInitializer());
> +
> +      if (getLang().CPlusPlus)
> +        Actions.ActOnCXXExitDeclInitializer(CurScope, ThisDecl);
> +
>       if (Init.isInvalid()) {
>         SkipUntil(tok::semi, true, true);
>         return DeclPtrTy();
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=73652&r1=73651&r2=73652&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Wed Jun 17 17:50:06 2009
> @@ -1721,6 +1721,17 @@
>   /// defining scope.
>   virtual void ActOnCXXExitDeclaratorScope(Scope *S, const  
> CXXScopeSpec &SS);
>
> +  /// ActOnCXXEnterDeclInitializer - Invoked when we are about to  
> parse an
> +  /// initializer for the declaration 'Dcl'.
> +  /// After this method is called, according to [C++ 3.4.1p13], if  
> 'Dcl' is a
> +  /// static data member of class X, names should be looked up in  
> the scope of
> +  /// class X.
> +  virtual void ActOnCXXEnterDeclInitializer(Scope *S, DeclPtrTy Dcl);
> +
> +  /// ActOnCXXExitDeclInitializer - Invoked after we are finished  
> parsing an
> +  /// initializer for the declaration 'Dcl'.
> +  virtual void ActOnCXXExitDeclInitializer(Scope *S, DeclPtrTy Dcl);
> +
>   // ParseObjCStringLiteral - Parse Objective-C string literals.
>   virtual ExprResult ParseObjCStringLiteral(SourceLocation *AtLocs,
>                                             ExprTy **Strings,
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=73652&r1=73651&r2=73652&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Wed Jun 17 17:50:06 2009
> @@ -2828,3 +2828,58 @@
>
>   return false;
> }
> +
> +/// ActOnCXXEnterDeclInitializer - Invoked when we are about to  
> parse an
> +/// initializer for the declaration 'Dcl'.
> +/// After this method is called, according to [C++ 3.4.1p13], if  
> 'Dcl' is a
> +/// static data member of class X, names should be looked up in the  
> scope of
> +/// class X.
> +void Sema::ActOnCXXEnterDeclInitializer(Scope *S, DeclPtrTy Dcl) {
> +  Decl *D = Dcl.getAs<Decl>();
> +  // If there is no declaration, there was an error parsing it.
> +  if (D == 0)
> +    return;
> +
> +  // Check whether it is a declaration with a nested name specifier  
> like
> +  // int foo::bar;
> +  if (!D->isOutOfLine())
> +    return;
> +
> +  // C++ [basic.lookup.unqual]p13
> +  //
> +  // A name used in the definition of a static data member of class X
> +  // (after the qualified-id of the static member) is looked up as  
> if the name
> +  // was used in a member function of X.
> +
> +  // Change current context into the context of the initializing  
> declaration.
> +
> +  assert(PreDeclaratorDC == 0 && "Previous declarator context not  
> popped?");
> +  PreDeclaratorDC = static_cast<DeclContext*>(S->getEntity());
> +  CurContext = D->getDeclContext();
> +  assert(CurContext && "No context?");
> +  S->setEntity(CurContext);
> +}
> +
> +/// ActOnCXXExitDeclInitializer - Invoked after we are finished  
> parsing an
> +/// initializer for the declaration 'Dcl'.
> +void Sema::ActOnCXXExitDeclInitializer(Scope *S, DeclPtrTy Dcl) {
> +  Decl *D = Dcl.getAs<Decl>();
> +  // If there is no declaration, there was an error parsing it.
> +  if (D == 0)
> +    return;
> +
> +  // Check whether it is a declaration with a nested name specifier  
> like
> +  // int foo::bar;
> +  if (!D->isOutOfLine())
> +    return;
> +
> +  assert(S->getEntity() == D->getDeclContext() && "Context  
> imbalance!");
> +  S->setEntity(PreDeclaratorDC);
> +  PreDeclaratorDC = 0;
> +
> +  // Reset CurContext to the nearest enclosing context.
> +  while (!S->getEntity() && S->getParent())
> +    S = S->getParent();
> +  CurContext = static_cast<DeclContext*>(S->getEntity());
> +  assert(CurContext && "No context?");
> +}
>
> Modified: cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/ 
> p13.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p13.cpp?rev=73652&r1=73651&r2=73652&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/ 
> p13.cpp (original)
> +++ cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/ 
> p13.cpp Wed Jun 17 17:50:06 2009
> @@ -1,5 +1,4 @@
> // RUN: clang-cc -fsyntax-only -verify %s
> -// XFAIL
>
> struct S {
>   static const int f0 = 0;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list