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
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61060 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h
index bfb3200..af72554 100644
--- a/include/clang/Parse/Action.h
+++ b/include/clang/Parse/Action.h
@@ -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
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h
index d6a3efd..ba5cc84 100644
--- a/include/clang/Parse/Parser.h
+++ b/include/clang/Parse/Parser.h
@@ -819,7 +819,7 @@
~DeclaratorScopeObj() {
if (SS.isSet())
- P.Actions.ActOnCXXExitDeclaratorScope(SS);
+ P.Actions.ActOnCXXExitDeclaratorScope(P.CurScope, SS);
}
};
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index bebd0cf..6ce3ec5 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -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,
diff --git a/lib/Sema/SemaCXXScopeSpec.cpp b/lib/Sema/SemaCXXScopeSpec.cpp
index 193e259..8b3218b 100644
--- a/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/lib/Sema/SemaCXXScopeSpec.cpp
@@ -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;
}
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 1be3071..5e0edcd 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -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))
diff --git a/test/SemaCXX/default2.cpp b/test/SemaCXX/default2.cpp
index 6a8bcb1..e5fe48d 100644
--- a/test/SemaCXX/default2.cpp
+++ b/test/SemaCXX/default2.cpp
@@ -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; }