[cfe-commits] r49107 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/AST/DeclObjC.h include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaDeclObjC.cpp test/Sema/check-dup-objc-decls-1.m
Steve Naroff
snaroff at apple.com
Wed Apr 2 11:30:49 PDT 2008
Author: snaroff
Date: Wed Apr 2 13:30:49 2008
New Revision: 49107
URL: http://llvm.org/viewvc/llvm-project?rev=49107&view=rev
Log:
Change ObjCInterfaceDecl to inherit from NamedDecl (not TypeDecl). While ObjCInterfaceDecl is arguably a TypeDecl, it isn't a ScopedDecl. Since TypeDecl's are scoped, it makes sense to simply treat them as NamedDecl's. I could have fiddled a bit more with the hierarchy (in terms of creating a non-scoped TypeDecl), however this probably isn't worth the effort.
I also finished unifying access to scope decl change by converting Sema::getObjCInterfaceDecl() to use Sema::LookupDecl(). This is much cleaner now:-)
Modified:
cfe/trunk/include/clang/AST/Decl.h
cfe/trunk/include/clang/AST/DeclObjC.h
cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/lib/Sema/SemaDeclObjC.cpp
cfe/trunk/test/Sema/check-dup-objc-decls-1.m
Modified: cfe/trunk/include/clang/AST/Decl.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Decl.h (original)
+++ cfe/trunk/include/clang/AST/Decl.h Wed Apr 2 13:30:49 2008
@@ -52,7 +52,6 @@
PropertyDecl,
// ScopedDecl
// TypeDecl
- ObjCInterface,
Typedef,
// TagDecl
Enum,
@@ -67,6 +66,7 @@
BlockVar,
FileVar,
ParmVar,
+ ObjCInterface,
ObjCCompatibleAlias,
ObjCMethod,
ObjCClass,
@@ -78,8 +78,8 @@
// of the class, to allow efficient classof.
NamedFirst = Field, NamedLast = ParmVar,
FieldFirst = Field, FieldLast = ObjCIvar,
- ScopedFirst = ObjCInterface, ScopedLast = ParmVar,
- TypeFirst = ObjCInterface, TypeLast = Class,
+ ScopedFirst = Typedef, ScopedLast = ParmVar,
+ TypeFirst = Typedef, TypeLast = Class,
TagFirst = Enum , TagLast = Class,
RecordFirst = Struct , RecordLast = Class,
ValueFirst = EnumConstant , ValueLast = ParmVar,
Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Wed Apr 2 13:30:49 2008
@@ -191,7 +191,11 @@
/// Unlike C++, ObjC is a single-rooted class model. In Cocoa, classes
/// typically inherit from NSObject (an exception is NSProxy).
///
-class ObjCInterfaceDecl : public TypeDecl {
+class ObjCInterfaceDecl : public NamedDecl {
+ /// TypeForDecl - This indicates the Type object that represents this
+ /// TypeDecl. It is a cache maintained by ASTContext::getObjCInterfaceType
+ Type *TypeForDecl;
+ friend class ASTContext;
/// Class's super class.
ObjCInterfaceDecl *SuperClass;
@@ -227,7 +231,7 @@
ObjCInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
IdentifierInfo *Id, bool FD, bool isInternal)
- : TypeDecl(ObjCInterface, atLoc, Id, 0), SuperClass(0),
+ : NamedDecl(ObjCInterface, atLoc, Id), TypeForDecl(0), SuperClass(0),
ReferencedProtocols(0), NumReferencedProtocols(0), Ivars(0),
NumIvars(0),
InstanceMethods(0), NumInstanceMethods(0),
Modified: cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h (original)
+++ cfe/trunk/include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h Wed Apr 2 13:30:49 2008
@@ -63,7 +63,6 @@
DISPATCH_CASE(Union,RecordDecl) // FIXME: Refine.
DISPATCH_CASE(Class,RecordDecl) // FIXME: Refine.
DISPATCH_CASE(Enum,EnumDecl)
- DISPATCH_CASE(ObjCInterface,ObjCInterfaceDecl)
default:
assert(false && "Subtype of ScopedDecl not handled.");
}
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Wed Apr 2 13:30:49 2008
@@ -94,7 +94,14 @@
/// with @protocol keyword, so that we can emit errors on duplicates and
/// find the declarations when needed.
llvm::DenseMap<IdentifierInfo*, ObjCProtocolDecl*> ObjCProtocols;
-
+
+ /// ObjCInterfaceDecls - Keep track of all class declarations declared
+ /// with @interface, so that we can emit errors on duplicates and
+ /// find the declarations when needed.
+ typedef llvm::DenseMap<const IdentifierInfo*,
+ ObjCInterfaceDecl*> ObjCInterfaceDeclsTy;
+ ObjCInterfaceDeclsTy ObjCInterfaceDecls;
+
/// ObjCAliasDecls - Keep track of all class declarations declared
/// with @compatibility_alias, so that we can emit errors on duplicates and
/// find the declarations when needed. This construct is ancient and will
@@ -102,7 +109,7 @@
typedef llvm::DenseMap<const IdentifierInfo*,
ObjCCompatibleAliasDecl*> ObjCAliasTy;
ObjCAliasTy ObjCAliasDecls;
-
+
// Enum values used by KnownFunctionIDs (see below).
enum {
id_printf,
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Apr 2 13:30:49 2008
@@ -86,19 +86,11 @@
/// getObjCInterfaceDecl - Look up a for a class declaration in the scope.
/// return 0 if one not found.
-/// FIXME: removed this when ObjCInterfaceDecl's aren't ScopedDecl's.
ObjCInterfaceDecl *Sema::getObjCInterfaceDecl(IdentifierInfo *Id) {
- ScopedDecl *IDecl;
- // Scan up the scope chain looking for a decl that matches this identifier
- // that is in the appropriate namespace.
- for (IDecl = Id->getFETokenInfo<ScopedDecl>(); IDecl;
- IDecl = IDecl->getNext())
- if (IDecl->getIdentifierNamespace() == Decl::IDNS_Ordinary)
- break;
-
- if (ObjCCompatibleAliasDecl *ADecl =
- dyn_cast_or_null<ObjCCompatibleAliasDecl>(IDecl))
- return ADecl->getClassInterface();
+ // The third "scope" argument is 0 since we aren't enabling lazy built-in
+ // creation from this context.
+ Decl *IDecl = LookupDecl(Id, Decl::IDNS_Ordinary, 0, false);
+
return dyn_cast_or_null<ObjCInterfaceDecl>(IDecl);
}
@@ -130,6 +122,9 @@
// Unlike typedef's, they can only be introduced at file-scope (and are
// therefore not scoped decls). They can, however, be shadowed by
// other names in IDNS_Ordinary.
+ ObjCInterfaceDeclsTy::iterator IDI = ObjCInterfaceDecls.find(II);
+ if (IDI != ObjCInterfaceDecls.end())
+ return IDI->second;
ObjCAliasTy::iterator I = ObjCAliasDecls.find(II);
if (I != ObjCAliasDecls.end())
return I->second->getClassInterface();
Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Wed Apr 2 13:30:49 2008
@@ -101,10 +101,7 @@
IDecl = ObjCInterfaceDecl::Create(Context, AtInterfaceLoc, NumProtocols,
ClassName);
- // Chain & install the interface decl into the identifier.
- IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
- ClassName->setFETokenInfo(IDecl);
-
+ ObjCInterfaceDecls[ClassName] = IDecl;
// Remember that this needs to be removed when the scope is popped.
TUScope->AddDecl(IDecl);
}
@@ -388,8 +385,7 @@
// Build, chain & install the interface decl into the identifier.
IDecl = ObjCInterfaceDecl::Create(Context, AtClassImplLoc, 0, ClassName,
false, true);
- IDecl->setNext(ClassName->getFETokenInfo<ScopedDecl>());
- ClassName->setFETokenInfo(IDecl);
+ ObjCInterfaceDecls[ClassName] = IDecl;
IDecl->setSuperClass(SDecl);
IDecl->setLocEnd(ClassLoc);
@@ -597,9 +593,7 @@
if (!IDecl) { // Not already seen? Make a forward decl.
IDecl = ObjCInterfaceDecl::Create(Context, AtClassLoc, 0, IdentList[i],
true);
- // Chain & install the interface decl into the identifier.
- IDecl->setNext(IdentList[i]->getFETokenInfo<ScopedDecl>());
- IdentList[i]->setFETokenInfo(IDecl);
+ ObjCInterfaceDecls[IdentList[i]] = IDecl;
// Remember that this needs to be removed when the scope is popped.
TUScope->AddDecl(IDecl);
Modified: cfe/trunk/test/Sema/check-dup-objc-decls-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/check-dup-objc-decls-1.m?rev=49107&r1=49106&r2=49107&view=diff
==============================================================================
--- cfe/trunk/test/Sema/check-dup-objc-decls-1.m (original)
+++ cfe/trunk/test/Sema/check-dup-objc-decls-1.m Wed Apr 2 13:30:49 2008
@@ -20,8 +20,7 @@
typedef int Gorf; // expected-error {{previous definition is here}}
- at interface Gorf @end // expected-error {{redefinition of 'Gorf' as different kind of symbol}} \
- // expected-error {{previous definition is here}}
+ at interface Gorf @end // expected-error {{redefinition of 'Gorf' as different kind of symbol}}
void Gorf() // expected-error {{redefinition of 'Gorf' as different kind of symbol}}
{
More information about the cfe-commits
mailing list