diff options
| author | Steve Naroff <snaroff@apple.com> | 2008-04-02 14:35:35 +0000 | 
|---|---|---|
| committer | Steve Naroff <snaroff@apple.com> | 2008-04-02 14:35:35 +0000 | 
| commit | 2fc93f5c432287fc10a48c58debf46c19fcc2024 (patch) | |
| tree | 7721dd4b1dbb40ec009a9736731f6eaea37dafea /clang | |
| parent | d12d21c0008261f5039d2cb62a8dc9098d0b60ef (diff) | |
| download | bcm5719-llvm-2fc93f5c432287fc10a48c58debf46c19fcc2024.tar.gz bcm5719-llvm-2fc93f5c432287fc10a48c58debf46c19fcc2024.zip | |
Two changes to Sema::LookupDecl() interface. 
(1) Remove IdLoc (it's never used). 
(2) Add a bool to enable/disable lazy builtin creaation (defaults to true).
This enables us to use LookupDecl() in Sema::isTypeName(), which is also part of this commit.
To make this work, I changed isTypeName() to be a non-const member function. I'm not happy with this, however I fiddled with making LookupDecl() and friends const and it got ugly pretty quickly. We can certainly add it back if/when someone has time to fiddle with it. For now, I thought this simplification was more important than retaining the const-ness. 
llvm-svn: 49087
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Parse/Action.h | 4 | ||||
| -rw-r--r-- | clang/lib/Parse/MinimalAction.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.h | 9 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 52 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 18 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 3 | 
7 files changed, 35 insertions, 55 deletions
| diff --git a/clang/include/clang/Parse/Action.h b/clang/include/clang/Parse/Action.h index abf34e205c9..83d1fea7159 100644 --- a/clang/include/clang/Parse/Action.h +++ b/clang/include/clang/Parse/Action.h @@ -94,7 +94,7 @@ public:    /// isTypeName - Return non-null if the specified identifier is a typedef name    /// in the current scope. -  virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) const = 0; +  virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) = 0;    /// ActOnDeclarator - This callback is invoked when a declarator is parsed and    /// 'Init' specifies the initializer if any.  This is for things like: @@ -730,7 +730,7 @@ public:    /// isTypeName - This looks at the IdentifierInfo::FETokenInfo field to    /// determine whether the name is a typedef or not in this scope. -  virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) const; +  virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S);    /// ActOnDeclarator - If this is a typedef declarator, we modify the    /// IdentifierInfo::FETokenInfo field to keep track of this fact, until S is diff --git a/clang/lib/Parse/MinimalAction.cpp b/clang/lib/Parse/MinimalAction.cpp index 250fa76ccc4..9b2f351158a 100644 --- a/clang/lib/Parse/MinimalAction.cpp +++ b/clang/lib/Parse/MinimalAction.cpp @@ -52,7 +52,7 @@ void MinimalAction:: ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {  /// determine whether the name is a type name (objc class name or typedef) or  /// not in this scope.  Action::DeclTy * -MinimalAction::isTypeName(const IdentifierInfo &II, Scope *S) const { +MinimalAction::isTypeName(const IdentifierInfo &II, Scope *S) {    if (TypeNameInfo *TI = II.getFETokenInfo<TypeNameInfo>())      if (TI->isTypeName)        return TI; diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index a91d3da720d..e98d9b59a7f 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -198,7 +198,7 @@ private:    //===--------------------------------------------------------------------===//    // Symbol table / Decl tracking callbacks: SemaDecl.cpp.    // -  virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) const; +  virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S);    virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup);    void AddInitializerToDecl(DeclTy *dcl, ExprTy *init);    virtual DeclTy *FinalizeDeclaratorGroup(Scope *S, DeclTy *Group); @@ -249,10 +249,11 @@ private:    /// More parsing and symbol table subroutines...    ParmVarDecl *ActOnParamDeclarator(struct DeclaratorChunk::ParamInfo &PI,                                       Scope *FnBodyScope);   -  Decl *LookupDecl(IdentifierInfo *II, unsigned NSI,  -                   SourceLocation IdLoc, Scope *S); +  Decl *LookupDecl(const IdentifierInfo *II, unsigned NSI, Scope *S, +                   bool enableLazyBuiltinCreation = true);    ObjCInterfaceDecl *getObjCInterfaceDecl(IdentifierInfo *Id); -  ScopedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID, Scope *S); +  ScopedDecl *LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID,  +                                  Scope *S);    ScopedDecl *ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II,                                   Scope *S);    // Decl attributes - this routine is the top level dispatcher.  diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index e247e2a52c5..c5901f0b913 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -32,24 +32,10 @@  #include "llvm/ADT/DenseSet.h"  using namespace clang; -Sema::DeclTy *Sema::isTypeName(const IdentifierInfo &II, Scope *S) const { -  Decl *IIDecl = II.getFETokenInfo<Decl>(); -  // Find first occurance of none-tagged declaration -  while (IIDecl && IIDecl->getIdentifierNamespace() != Decl::IDNS_Ordinary) -    IIDecl = cast<ScopedDecl>(IIDecl)->getNext(); -   -  if (!IIDecl) { -    if (getLangOptions().ObjC1) { -      // @interface and @compatibility_alias result in new type references.  -      // Creating a class alias is *extremely* rare. -      ObjCAliasTy::const_iterator I = ObjCAliasDecls.find(&II); -      if (I != ObjCAliasDecls.end()) -        return I->second->getClassInterface(); -    }     -    return 0; -  } -  // FIXME: remove ObjCInterfaceDecl check when we make it a named decl. -  if (isa<TypedefDecl>(IIDecl) || isa<ObjCInterfaceDecl>(IIDecl)) +Sema::DeclTy *Sema::isTypeName(const IdentifierInfo &II, Scope *S) { +  Decl *IIDecl = LookupDecl(&II, Decl::IDNS_Ordinary, S, false); + +  if (IIDecl && (isa<TypedefDecl>(IIDecl) || isa<ObjCInterfaceDecl>(IIDecl)))      return IIDecl;    return 0;  } @@ -113,13 +99,13 @@ ObjCInterfaceDecl *Sema::getObjCInterfaceDecl(IdentifierInfo *Id) {    if (ObjCCompatibleAliasDecl *ADecl =        dyn_cast_or_null<ObjCCompatibleAliasDecl>(IDecl))      return ADecl->getClassInterface(); -  return cast_or_null<ObjCInterfaceDecl>(IDecl); +  return dyn_cast_or_null<ObjCInterfaceDecl>(IDecl);  }  /// LookupDecl - Look up the inner-most declaration in the specified  /// namespace. -Decl *Sema::LookupDecl(IdentifierInfo *II, unsigned NSI, -                       SourceLocation IdLoc, Scope *S) { +Decl *Sema::LookupDecl(const IdentifierInfo *II, unsigned NSI, +                       Scope *S, bool enableLazyBuiltinCreation) {    if (II == 0) return 0;    Decl::IdentifierNamespace NS = (Decl::IdentifierNamespace)NSI; @@ -134,10 +120,11 @@ Decl *Sema::LookupDecl(IdentifierInfo *II, unsigned NSI,    // corresponds to a compiler builtin, create the decl object for the builtin    // now, injecting it into translation unit scope, and return it.    if (NS == Decl::IDNS_Ordinary) { -    // If this is a builtin on this (or all) targets, create the decl. -    if (unsigned BuiltinID = II->getBuiltinID()) -      return LazilyCreateBuiltin(II, BuiltinID, S); - +    if (enableLazyBuiltinCreation) { +      // If this is a builtin on this (or all) targets, create the decl. +      if (unsigned BuiltinID = II->getBuiltinID()) +        return LazilyCreateBuiltin((IdentifierInfo *)II, BuiltinID, S); +    }      if (getLangOptions().ObjC1) {        // @interface and @compatibility_alias introduce typedef-like names.        // Unlike typedef's, they can only be introduced at file-scope (and are  @@ -157,8 +144,7 @@ void Sema::InitBuiltinVaListType()      return;    IdentifierInfo *VaIdent = &Context.Idents.get("__builtin_va_list"); -  Decl *VaDecl = LookupDecl(VaIdent, Decl::IDNS_Ordinary,  -                            SourceLocation(), TUScope); +  Decl *VaDecl = LookupDecl(VaIdent, Decl::IDNS_Ordinary, TUScope);    TypedefDecl *VaTypedef = cast<TypedefDecl>(VaDecl);    Context.setBuiltinVaListType(Context.getTypedefType(VaTypedef));  } @@ -716,7 +702,7 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {      S = S->getParent();    // See if this is a redefinition of a variable in the same scope. -  Decl *PrevDecl = LookupDecl(II, Decl::IDNS_Ordinary, D.getIdentifierLoc(), S); +  Decl *PrevDecl = LookupDecl(II, Decl::IDNS_Ordinary, S);    ScopedDecl *New;    bool InvalidDecl = false; @@ -988,8 +974,7 @@ Sema::ActOnParamDeclarator(struct DeclaratorChunk::ParamInfo &PI,    // TODO: CHECK FOR CONFLICTS, multiple decls with same name in one scope.    // Can this happen for params?  We already checked that they don't conflict    // among each other.  Here they can only shadow globals, which is ok. -  if (/*Decl *PrevDecl = */LookupDecl(II, Decl::IDNS_Ordinary, -                                      PI.IdentLoc, FnScope)) { +  if (/*Decl *PrevDecl = */LookupDecl(II, Decl::IDNS_Ordinary, FnScope)) {    } @@ -1069,7 +1054,7 @@ Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Declarator &D) {    // See if this is a redefinition.    Decl *PrevDcl = LookupDecl(D.getIdentifier(), Decl::IDNS_Ordinary, -                             D.getIdentifierLoc(), GlobalScope); +                             GlobalScope);    if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(PrevDcl)) {      if (FD->getBody()) {        Diag(D.getIdentifierLoc(), diag::err_redefinition,  @@ -1224,8 +1209,7 @@ Sema::DeclTy *Sema::ActOnTag(Scope *S, unsigned TagType, TagKind TK,    // If this is a named struct, check to see if there was a previous forward    // declaration or definition.    if (TagDecl *PrevDecl =  -          dyn_cast_or_null<TagDecl>(LookupDecl(Name, Decl::IDNS_Tag, -                                               NameLoc, S))) { +          dyn_cast_or_null<TagDecl>(LookupDecl(Name, Decl::IDNS_Tag, S))) {      // If this is a use of a previous tag, or if the tag is already declared in      // the same scope (so that the definition/declaration completes or @@ -1548,7 +1532,7 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl,    // Verify that there isn't already something declared with this name in this    // scope. -  if (Decl *PrevDecl = LookupDecl(Id, Decl::IDNS_Ordinary, IdLoc, S)) { +  if (Decl *PrevDecl = LookupDecl(Id, Decl::IDNS_Ordinary, S)) {      if (S->isDeclScope(PrevDecl)) {        if (isa<EnumConstantDecl>(PrevDecl))          Diag(IdLoc, diag::err_redefinition_of_enumerator, Id->getName()); diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 2385cd07bd8..62e7c8af1e9 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -79,7 +79,7 @@ Sema::DeclTy *Sema::ActOnStartClassInterface(    assert(ClassName && "Missing class identifier");    // Check for another declaration kind with the same name. -  Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, ClassLoc,TUScope); +  Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);    if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {      Diag(ClassLoc, diag::err_redefinition_different_kind,           ClassName->getName()); @@ -112,7 +112,7 @@ Sema::DeclTy *Sema::ActOnStartClassInterface(    if (SuperName) {      ObjCInterfaceDecl* SuperClassEntry = 0;      // Check if a different kind of symbol declared in this scope. -    PrevDecl = LookupDecl(SuperName, Decl::IDNS_Ordinary, SuperLoc, TUScope); +    PrevDecl = LookupDecl(SuperName, Decl::IDNS_Ordinary, TUScope);      if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {        Diag(SuperLoc, diag::err_redefinition_different_kind,             SuperName->getName()); @@ -158,8 +158,7 @@ Sema::DeclTy *Sema::ActOnCompatiblityAlias(SourceLocation AtLoc,                                             IdentifierInfo *ClassName,                                             SourceLocation ClassLocation) {    // Look for previous declaration of alias name -  Decl *ADecl = LookupDecl(AliasName, Decl::IDNS_Ordinary, -                           AliasLocation, TUScope); +  Decl *ADecl = LookupDecl(AliasName, Decl::IDNS_Ordinary, TUScope);    if (ADecl) {      if (isa<ObjCCompatibleAliasDecl>(ADecl)) {        Diag(AliasLocation, diag::warn_previous_alias_decl); @@ -173,8 +172,7 @@ Sema::DeclTy *Sema::ActOnCompatiblityAlias(SourceLocation AtLoc,      return 0;    }    // Check for class declaration -  Decl *CDeclU = LookupDecl(ClassName, Decl::IDNS_Ordinary, -                            ClassLocation, TUScope); +  Decl *CDeclU = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);    ObjCInterfaceDecl *CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(CDeclU);    if (CDecl == 0) {      Diag(ClassLocation, diag::warn_undef_interface, ClassName->getName()); @@ -347,7 +345,7 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation(                        SourceLocation SuperClassLoc) {    ObjCInterfaceDecl* IDecl = 0;    // Check for another declaration kind with the same name. -  Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, ClassLoc,TUScope); +  Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope);    if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {      Diag(ClassLoc, diag::err_redefinition_different_kind,           ClassName->getName()); @@ -364,8 +362,7 @@ Sema::DeclTy *Sema::ActOnStartClassImplementation(    ObjCInterfaceDecl* SDecl = 0;    if (SuperClassname) {      // Check if a different kind of symbol declared in this scope. -    PrevDecl = LookupDecl(SuperClassname, Decl::IDNS_Ordinary, -                          SuperClassLoc, TUScope); +    PrevDecl = LookupDecl(SuperClassname, Decl::IDNS_Ordinary, TUScope);      if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {        Diag(SuperClassLoc, diag::err_redefinition_different_kind,             SuperClassname->getName()); @@ -590,8 +587,7 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,    for (unsigned i = 0; i != NumElts; ++i) {      // Check for another declaration kind with the same name. -    Decl *PrevDecl = LookupDecl(IdentList[i], Decl::IDNS_Ordinary, -                                AtClassLoc, TUScope); +    Decl *PrevDecl = LookupDecl(IdentList[i], Decl::IDNS_Ordinary, TUScope);      if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {        Diag(AtClassLoc, diag::err_redefinition_different_kind,             IdentList[i]->getName()); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 05926018601..9c36c17e493 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -75,7 +75,7 @@ Sema::ExprResult Sema::ActOnIdentifierExpr(Scope *S, SourceLocation Loc,                                             IdentifierInfo &II,                                             bool HasTrailingLParen) {    // Could be enum-constant, value decl, instance variable, etc. -  Decl *D = LookupDecl(&II, Decl::IDNS_Ordinary, Loc, S); +  Decl *D = LookupDecl(&II, Decl::IDNS_Ordinary, S);    // If this reference is in an Objective-C method, then ivar lookup happens as    // well. diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 00a13183769..00361658f75 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -52,8 +52,7 @@ Sema::ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,      // Initialize the constant string interface lazily. This assumes      // the NSConstantString interface is seen in this translation unit.      IdentifierInfo *NSIdent = &Context.Idents.get("NSConstantString"); -    Decl *IFace = LookupDecl(NSIdent, Decl::IDNS_Ordinary,  -                             SourceLocation(), TUScope); +    Decl *IFace = LookupDecl(NSIdent, Decl::IDNS_Ordinary, TUScope);      ObjCInterfaceDecl *strIFace = dyn_cast_or_null<ObjCInterfaceDecl>(IFace);      if (!strIFace)        return Diag(S->getLocStart(), diag::err_undef_interface, | 

