__super inside return statement
Nikola Smiljanic
popizdeh at gmail.com
Thu Oct 2 20:54:48 PDT 2014
Excellent catch Richard. I tried to do this initially but couldn't since
lookup branching calls both LookupQualifiedName and LookupParsedName but it
makes much more sense now...
On Fri, Oct 3, 2014 at 10:49 AM, Richard Smith <richard at metafoo.co.uk>
wrote:
> Is there a reason not to put the check for __super into LookupParsedName
> itself?
>
> On Tue, Sep 30, 2014 at 10:54 PM, Nikola Smiljanic <popizdeh at gmail.com>
> wrote:
>
>> Lookup needs to be performed in one more place for this to work.
>> Otherwise lookup is performed in the wrong context which leading to a
>> recursive call. Provided that both methods have the same name and signature.
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141003/2dddcc33/attachment.html>
-------------- next part --------------
diff --git include/clang/Sema/Sema.h include/clang/Sema/Sema.h
index d5baec0..4b42f27 100644
--- include/clang/Sema/Sema.h
+++ include/clang/Sema/Sema.h
@@ -2616,7 +2616,7 @@ public:
ObjCProtocolDecl *LookupProtocol(IdentifierInfo *II, SourceLocation IdLoc,
RedeclarationKind Redecl
= NotForRedeclaration);
- void LookupInSuper(LookupResult &R, CXXRecordDecl *Class);
+ bool LookupInSuper(LookupResult &R, CXXRecordDecl *Class);
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
QualType T1, QualType T2,
diff --git lib/Sema/SemaDecl.cpp lib/Sema/SemaDecl.cpp
index 9203df3..74dfaba 100644
--- lib/Sema/SemaDecl.cpp
+++ lib/Sema/SemaDecl.cpp
@@ -702,11 +702,7 @@ Sema::NameClassification Sema::ClassifyName(Scope *S,
}
LookupResult Result(*this, Name, NameLoc, LookupOrdinaryName);
- NestedNameSpecifier *NNS = SS.getScopeRep();
- if (NNS && NNS->getKind() == NestedNameSpecifier::Super)
- LookupInSuper(Result, NNS->getAsRecordDecl());
- else
- LookupParsedName(Result, S, &SS, !CurMethod);
+ LookupParsedName(Result, S, &SS, !CurMethod);
// For unqualified lookup in a class template in MSVC mode, look into
// dependent base classes where the primary class template is known.
diff --git lib/Sema/SemaLookup.cpp lib/Sema/SemaLookup.cpp
index 76e0ba1..639e651 100644
--- lib/Sema/SemaLookup.cpp
+++ lib/Sema/SemaLookup.cpp
@@ -1782,7 +1782,8 @@ bool Sema::LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx,
/// contexts that receive a name and an optional C++ scope specifier
/// (e.g., "N::M::x"). It will then perform either qualified or
/// unqualified name lookup (with LookupQualifiedName or LookupName,
-/// respectively) on the given name and return those results.
+/// respectively) on the given name and return those results. It will
+/// perform a special type of lookup for "__super::" scope specifier.
///
/// @param S The scope from which unqualified name lookup will
/// begin.
@@ -1802,6 +1803,10 @@ bool Sema::LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS,
}
if (SS && SS->isSet()) {
+ NestedNameSpecifier *NNS = SS->getScopeRep();
+ if (NNS->getKind() == NestedNameSpecifier::Super)
+ return LookupInSuper(R, NNS->getAsRecordDecl());
+
if (DeclContext *DC = computeDeclContext(*SS, EnteringContext)) {
// We have resolved the scope specifier to a particular declaration
// contex, and will perform name lookup in that context.
@@ -1831,7 +1836,9 @@ bool Sema::LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS,
///
/// \param Class The context in which qualified name lookup will
/// search. Name lookup will search in all base classes merging the results.
-void Sema::LookupInSuper(LookupResult &R, CXXRecordDecl *Class) {
+///
+/// @returns True if any decls were found (but possibly ambiguous)
+bool Sema::LookupInSuper(LookupResult &R, CXXRecordDecl *Class) {
for (const auto &BaseSpec : Class->bases()) {
CXXRecordDecl *RD = cast<CXXRecordDecl>(
BaseSpec.getType()->castAs<RecordType>()->getDecl());
@@ -1843,6 +1850,8 @@ void Sema::LookupInSuper(LookupResult &R, CXXRecordDecl *Class) {
}
R.resolveKind();
+
+ return !R.empty();
}
/// \brief Produce a diagnostic describing the ambiguity that resulted
diff --git test/SemaCXX/MicrosoftSuper.cpp test/SemaCXX/MicrosoftSuper.cpp
index 1bf97ac..13138ca 100644
--- test/SemaCXX/MicrosoftSuper.cpp
+++ test/SemaCXX/MicrosoftSuper.cpp
@@ -29,12 +29,14 @@ struct Derived : Base1 {
X = sizeof(__super::XXX)
};
- void foo(int i) {
- __super::foo(i);
+ void foo() {
+ __super::foo(1);
- if (i == 0) {
- __super::foo(i);
+ if (true) {
+ __super::foo(1);
}
+
+ return __super::foo(1);
}
static void bar() {
More information about the cfe-commits
mailing list