rename Decl::CompatibleAlias -> ObjCCompatibleAlias.

Fix objc ivar lookup.  Ivar lookup should occur between lookup
of method-local values and lookup of globals.  Emulate this with
some logic in the handling of Sema::ActOnIdentifierExpr.

Two todo's left:
 1) sema shouldn't turn a bare reference to an ivar into "self->ivar"
    in the AST.  This is a hack.
 2) The new ScopedDecl::isDefinedOutsideFunctionOrMethod method does
    not correctly handle typedefs and enum constants yet.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48972 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index df403eb..bad65cf 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -193,7 +193,7 @@
   case ObjCIvar:            nIvarDecls++; break;
   case ObjCImplementation:  nObjCImplementationDecls++; break;
   case ObjCCategoryImpl:    nObjCCategoryImpl++; break;
-  case CompatibleAlias:     nObjCCompatibleAlias++; break;
+  case ObjCCompatibleAlias: nObjCCompatibleAlias++; break;
   case PropertyDecl:        nObjCPropertyDecl++; break;
   case LinkageSpec:         nLinkageSpecDecl++; break;
   case FileScopeAsm:        nFileScopeAsmDecl++; break;
@@ -319,12 +319,46 @@
   return (*DeclAttrs)[this];
 }
 
+//===----------------------------------------------------------------------===//
+// NamedDecl Implementation
+//===----------------------------------------------------------------------===//
+
 const char *NamedDecl::getName() const {
   if (const IdentifierInfo *II = getIdentifier())
     return II->getName();
   return "";
 }
 
+//===----------------------------------------------------------------------===//
+// ScopedDecl Implementation
+//===----------------------------------------------------------------------===//
+
+// isDefinedOutsideFunctionOrMethod - This predicate returns true if this
+// scoped decl is defined outside the current function or method.  This is
+// roughly global variables and functions, but also handles enums (which could
+// be defined inside or outside a function etc).
+bool ScopedDecl::isDefinedOutsideFunctionOrMethod() const {
+  if (const VarDecl *VD = dyn_cast<VarDecl>(this))
+    return VD->hasGlobalStorage();
+  if (isa<FunctionDecl>(this))
+    return true;
+  
+  // FIXME: Why is ObjCCompatibleAlias a scopedecl?
+  if (isa<ObjCCompatibleAliasDecl>(this))
+    return true;
+  
+  // FIXME: This needs to check the context the decl was defined in!
+  if (isa<TypeDecl>(this) || isa<EnumConstantDecl>(this))
+    return true;
+  
+  assert(0 && "Unknown ScopedDecl!");
+  return false;
+}
+
+//===----------------------------------------------------------------------===//
+// FunctionDecl Implementation
+//===----------------------------------------------------------------------===//
+
 FunctionDecl::~FunctionDecl() {
   delete[] ParamInfo;
 }
@@ -346,6 +380,9 @@
   }
 }
 
+//===----------------------------------------------------------------------===//
+// RecordDecl Implementation
+//===----------------------------------------------------------------------===//
 
 /// defineBody - When created, RecordDecl's correspond to a forward declared
 /// record.  This method is used to mark the decl as being defined, with the
@@ -360,14 +397,13 @@
   }
 }
 
-FieldDecl* RecordDecl::getMember(IdentifierInfo *name) {
+FieldDecl *RecordDecl::getMember(IdentifierInfo *II) {
   if (Members == 0 || NumMembers < 0)
     return 0;
   
-  // linear search. When C++ classes come along, will likely need to revisit.
-  for (int i = 0; i < NumMembers; ++i) {
-    if (Members[i]->getIdentifier() == name)
+  // Linear search.  When C++ classes come along, will likely need to revisit.
+  for (int i = 0; i != NumMembers; ++i)
+    if (Members[i]->getIdentifier() == II)
       return Members[i];
-  }
   return 0;
 }