[cfe-commits] r61060 - in /cfe/trunk: include/clang/Parse/Action.h include/clang/Parse/Parser.h lib/Sema/Sema.h lib/Sema/SemaCXXScopeSpec.cpp lib/Sema/SemaDecl.cpp test/SemaCXX/default2.cpp

Douglas Gregor dgregor at apple.com
Mon Dec 15 16:38:16 PST 2008


Author: dgregor
Date: Mon Dec 15 18:38:16 2008
New Revision: 61060

URL: http://llvm.org/viewvc/llvm-project?rev=61060&view=rev
Log:
Make name lookup when we're inside a declarator's scope, such as ClassName::func, work with the new unqualified name lookup code. Test it with default arguments in out-of-line member definitions

Modified:
    cfe/trunk/include/clang/Parse/Action.h
    cfe/trunk/include/clang/Parse/Parser.h
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/test/SemaCXX/default2.cpp

Modified: cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=61060&r1=61059&r2=61060&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Mon Dec 15 18:38:16 2008
@@ -152,7 +152,7 @@
   /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
   /// Used to indicate that names should revert to being looked up in the
   /// defining scope.
-  virtual void ActOnCXXExitDeclaratorScope(const CXXScopeSpec &SS) {
+  virtual void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
   }
 
   /// ActOnDeclarator - This callback is invoked when a declarator is parsed and

Modified: cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=61060&r1=61059&r2=61060&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/trunk/include/clang/Parse/Parser.h Mon Dec 15 18:38:16 2008
@@ -819,7 +819,7 @@
 
     ~DeclaratorScopeObj() {
       if (SS.isSet())
-        P.Actions.ActOnCXXExitDeclaratorScope(SS);
+        P.Actions.ActOnCXXExitDeclaratorScope(P.CurScope, SS);
     }
   };
   

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=61060&r1=61059&r2=61060&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Mon Dec 15 18:38:16 2008
@@ -903,7 +903,7 @@
   /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
   /// Used to indicate that names should revert to being looked up in the
   /// defining scope.
-  virtual void ActOnCXXExitDeclaratorScope(const CXXScopeSpec &SS);
+  virtual void ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS);
 
   // ParseObjCStringLiteral - Parse Objective-C string literals.
   virtual ExprResult ParseObjCStringLiteral(SourceLocation *AtLocs, 

Modified: cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp?rev=61060&r1=61059&r2=61060&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCXXScopeSpec.cpp Mon Dec 15 18:38:16 2008
@@ -134,8 +134,8 @@
 void Sema::ActOnCXXEnterDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
   assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
   assert(PreDeclaratorDC == 0 && "Previous declarator context not popped?");
-  PreDeclaratorDC = CurContext;
-  CurContext = static_cast<DeclContext*>(SS.getScopeRep());
+  PreDeclaratorDC = static_cast<DeclContext*>(S->getEntity());
+  S->setEntity(static_cast<DeclContext*>(SS.getScopeRep()));
 }
 
 /// ActOnCXXExitDeclaratorScope - Called when a declarator that previously
@@ -143,10 +143,9 @@
 /// CXXScopeSpec that was passed to ActOnCXXEnterDeclaratorScope as well.
 /// Used to indicate that names should revert to being looked up in the
 /// defining scope.
-void Sema::ActOnCXXExitDeclaratorScope(const CXXScopeSpec &SS) {
+void Sema::ActOnCXXExitDeclaratorScope(Scope *S, const CXXScopeSpec &SS) {
   assert(SS.isSet() && "Parser passed invalid CXXScopeSpec.");
-  assert(CurContext == static_cast<DeclContext*>(SS.getScopeRep()) &&
-         "Context imbalance!");
-  CurContext = PreDeclaratorDC;
+  assert(S->getEntity() == SS.getScopeRep() && "Context imbalance!");
+  S->setEntity(PreDeclaratorDC);
   PreDeclaratorDC = 0;
 }

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=61060&r1=61059&r2=61060&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Dec 15 18:38:16 2008
@@ -221,7 +221,7 @@
 Decl *Sema::LookupDecl(DeclarationName Name, unsigned NSI, Scope *S,
                        const DeclContext *LookupCtx,
                        bool enableLazyBuiltinCreation,
-                      bool LookInParent) {
+                       bool LookInParent) {
   if (!Name) return 0;
   unsigned NS = NSI;
   if (getLangOptions().CPlusPlus && (NS & Decl::IDNS_Ordinary))

Modified: cfe/trunk/test/SemaCXX/default2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/default2.cpp?rev=61060&r1=61059&r2=61060&view=diff

==============================================================================
--- cfe/trunk/test/SemaCXX/default2.cpp (original)
+++ cfe/trunk/test/SemaCXX/default2.cpp Mon Dec 15 18:38:16 2008
@@ -68,5 +68,12 @@
   int mem1(int i = a); // expected-error{{invalid use of nonstatic data member 'a'}}
   // FIXME: The code below is well-formed.
   //  int mem2(int i = b); // OK; use X::b 
+  int mem3(int i);
+  int mem4(int i);
   static int b; 
 }; 
+
+int Y::mem3(int i = b) { return i; } // OK; use X::b
+
+int Y::mem4(int i = a) // expected-error{{invalid use of nonstatic data member 'a'}}
+{ return i; }





More information about the cfe-commits mailing list