[cfe-commits] r93271 - in /cfe/trunk: lib/Sema/Sema.h lib/Sema/SemaExpr.cpp test/SemaObjC/ivar-lookup-resolution-builtin.m
Douglas Gregor
dgregor at apple.com
Tue Jan 12 16:42:46 PST 2010
On Jan 12, 2010, at 3:58 PM, Fariborz Jahanian wrote:
> Author: fjahanian
> Date: Tue Jan 12 17:58:59 2010
> New Revision: 93271
>
> URL: http://llvm.org/viewvc/llvm-project?rev=93271&view=rev
> Log:
> When in objective-c methods, do the built-in name lookup after
> ivar name lookup. Fixes pr5986.
>
> Added:
> cfe/trunk/test/SemaObjC/ivar-lookup-resolution-builtin.m
> Modified:
> cfe/trunk/lib/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaExpr.cpp
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=93271&r1=93270&r2=93271&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Tue Jan 12 17:58:59 2010
> @@ -1481,7 +1481,8 @@
>
> OwningExprResult LookupInObjCMethod(LookupResult &R,
> Scope *S,
> - IdentifierInfo *II);
> + IdentifierInfo *II,
> + bool
> AllowBuiltinCreation=false);
>
> OwningExprResult ActOnDependentIdExpression(const CXXScopeSpec &SS,
> DeclarationName Name,
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=93271&r1=93270&r2=93271&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 12 17:58:59 2010
> @@ -1033,12 +1033,13 @@
> // Just re-use the lookup done by isTemplateName.
> DecomposeTemplateName(R, Id);
> } else {
> - LookupParsedName(R, S, &SS, true);
> + bool IvarLookupFollowUp = (!SS.isSet() && II && getCurMethodDecl
> ());
> + LookupParsedName(R, S, &SS, !IvarLookupFollowUp);
>
> // If this reference is in an Objective-C method, then we need
> to do
> // some special Objective-C lookup, too.
> - if (!SS.isSet() && II && getCurMethodDecl()) {
> - OwningExprResult E(LookupInObjCMethod(R, S, II));
> + if (IvarLookupFollowUp) {
> + OwningExprResult E(LookupInObjCMethod(R, S, II, true));
> if (E.isInvalid())
> return ExprError();
>
> @@ -1218,7 +1219,8 @@
> /// Returns a null sentinel to indicate trivial success.
> Sema::OwningExprResult
> Sema::LookupInObjCMethod(LookupResult &Lookup, Scope *S,
> - IdentifierInfo *II) {
> + IdentifierInfo *II,
> + bool AllowBuiltinCreation) {
> SourceLocation Loc = Lookup.getNameLoc();
>
> // There are two cases to handle here. 1) scoped lookup could
> have failed,
> @@ -1299,7 +1301,18 @@
> T = Context.getObjCClassType();
> return Owned(new (Context) ObjCSuperExpr(Loc, T));
> }
> -
> + if (Lookup.empty() && II && AllowBuiltinCreation) {
> + // FIXME. Consolidate this with similar code in LookupName.
> + if (unsigned BuiltinID = II->getBuiltinID()) {
> + if (!(getLangOptions().CPlusPlus &&
> + Context.BuiltinInfo.isPredefinedLibFunction
> (BuiltinID))) {
> + NamedDecl *D = LazilyCreateBuiltin((IdentifierInfo *)II,
> BuiltinID,
> + S,
> Lookup.isForRedeclaration(),
> + Lookup.getNameLoc());
> + if (D) Lookup.addDecl(D);
> + }
> + }
> + }
> // Sentinel value saying that we didn't do anything special.
> return Owned((Expr*) 0);
> }
C++ has a cleaner way of handling lookup for its data members, e.g.,
struct X {
int member;
int getMember() { return member; }
};
C++ actually walks the Scope chain upward, and checks for each Scope
whether it has an Entity (which is a DeclContext). For entities that
are C++ member functions (like X::getMember()), it then performs
lookup into the class type (X), its base classes, and so on.
Now, the C++ implementation is slower than just checking the
identifier chain, but it would make sense to take this slower path
when we know we're in an Objective-C method (getCurMethodDecl() != 0).
That would unify the name-lookup logic for Objective-C and C++
somewhat, which is good for Objective-C++ and also would probably
address
http://llvm.org/bugs/show_bug.cgi?id=5984
- Doug
More information about the cfe-commits
mailing list